Разделение значения в awk

Я застрял с подходом необходимо отделить значение до / и после / Вот содержимое файла:

Min/Max Inference Time : 70 ms / 290 ms
 Average Inference Time : 90 ms

Ожидаемый результат:

Min : 70
Max : 290

Вот что я попробовал:

cat scores.csv | awk '/\//' | sed 's/ms//g'| awk 'BEGIN{FS=":"}{print $2}'

Но я не знаю, как разделить значение до / и после / для ожидаемого выше результата.

0
задан 20.03.2019, 00:26

4 ответа

Первое, что вы могли бы разделить пробелом и косой чертой. И посмотрите на каждый элемент:

awk -F'[/ ]' '{ for (i = 1; i <= NF; ++i) print i ": " $i}' scores.csv
1: Min
2: Max
3: Inference
4: Time
5: :
6: 70
7: ms
8:
9:
10: 290
11: ms

после этого вы берете правильные элементы:

awk -F'[/ ]' '{ print "Min : " $6; print "Max : " $10 }' scores.csv
Min : 70
Max : 290
0
ответ дан 30.04.2019, 20:05
  • 1
    Обратите внимание, что я заставил пример использовать код клавиши 13, который является ввести нажатием клавиши – Rory McCrossan 30.03.2019, 00:15

Попробуйте awk с несколькими разделителями

$ echo "Min/Max Inference Time : 70 ms / 290 ms" | \
awk -F"[/ ]+" ' { print $1, ":", $(NF-3); print $2,":",$(NF-1) } '
Min : 70
Max : 290
$

РЕДАКТ. EDIT2:

$ awk -F: -v OFS=":" ' { if(/\//) {  split($1,a,"[ /]+"); split($2,b,"ms|/"); print a[1],b[1]; print a[2],b[3] } else { print } }' scores.csv
Min: 70
Max: 290
 Average Inference Time : 90 ms
$

с Perl,

$ perl -lne  ' /(.+?)\/(.+?)\s+.+?(\d+).+?(\d+)/ ? print $1,": ",$3,"\n",$2,": ",$4 : print ' scores.csv
Min: 70
Max: 290
 Average Inference Time : 90 ms
$
0
ответ дан 30.04.2019, 20:05
  • 1
    Я не хочу изменять полевой разделитель :, поскольку другие очки зависят – Arya 20.03.2019, 00:15
  • 2
    Вы имеете в виду.. выходной разделитель?.. можете Вы дополнительные образцы? – stack0114106 20.03.2019, 00:20
  • 3
    Не идя с ожидаемым выводом, посмотрите дополнительные образцы выше в моем сообщении – Arya 20.03.2019, 00:37
  • 4
    @Arya.. хорошо.. обновленный ответ, проверьте мой EDIT2 – stack0114106 20.03.2019, 00:42
  • 5
    @Arya.. Я добавил решение для Perl также.. оба результаты соответствуют Wiktors – stack0114106 20.03.2019, 00:47
  • 6
    Мухи или файлы? – Metadata 29.03.2019, 23:39

Вы можете использовать одну команду sed:

sed -E 's,.*\b([0-9]+[[:blank:]]*ms)[[:blank:]]*/[[:blank:]]*([0-9]+[[:blank:]]*ms).*,Min : \1\nMax : \2,'   scores.csv  >  new_scores.csv 

См. online sed demo

Детали паттернов

  • .*\b - любые 0+ символов, как можно больше, вплоть до границы слова с последующими шаблонами
    • ([0-9]+[[:blank:]]*ms) - Группа 1: 1 или более цифр, 0+ пробелы, ms подстрока
    • [[:blank:]]*/[[:blank:]]* - a /, заключенные в 0 или более пробелов
    • ([0-9]+[[:blank:]]*ms) - группа 2: 1 или более цифр, 0+ пробелов, [118 ] подстрока
    • .* - остаток строки.

Шаблон замены - Min : \1\nMax : \2, где \1 относится к тексту, захваченному с Группой 1, и \2 относится к тексту, захваченному с Группой 2.

0
ответ дан 30.04.2019, 20:05

Не могли бы вы попробовать следующее. Просто установите правильные FS (разделители полей) для каждой строки и затем напечатайте их (НЕТ манипулирования данными и т. Д.)

awk -F"Inference Time : |/| ms" -v OFS=" : " 'FNR==1{$1=$1;print $1,$3 ORS $2,$5}' Input_file

Объяснение: Добавление объяснения код выше.

awk -F"Inference Time : |/| ms" -v OFS=" : " '     ##Setting field separator as string Inference Time :  OR / OR ms for all lines and setting OFS as space colon space here.
FNR==1{                                            ##Checking condition if line is 1st line then do following.
  $1=$1                                            ##Re-setting $1=$1 to reflect value of OFS here.
  print $1,$3 ORS $2,$5                            ##Printing values of $1,$3 then ORS with $2,$5 here as per OP ask.
}                                                  ##Closing BLOCK for FNR==1 condition here.
'  Input_file                                      ##Mentioning Input_file name here.

Вывод будет следующим.

Min : 70
Max  :  290
0
ответ дан 30.04.2019, 20:05
  • 1
    @Arya, мог Вы проверять этот ответ и сообщать мне, помогает ли это, добавило надлежащее объяснение слишком здесь. – RavinderSingh13 20.03.2019, 00:39
  • 2
    Вероятно, будет работать, но I' m довольно в новинку для этой целой вещи кодирования. Ничего не происходит для меня во фрагменте кода так I' m пытающийся понять код. – William Brand 30.03.2019, 00:04

Теги

Похожие вопросы