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

Согласно http://www.sqlite.org/limits.html (пункт 9), SQLite не может (по умолчанию) обрабатывать более 999 параметров для запроса, поэтому решения здесь (генерирование нужного списка заполнителей) не удастся, если у вас есть тысячи предметов, которые вы ищете IN. Если это так, вам нужно будет разбить список, затем перебрать его части и объединить результаты самостоятельно.

Если вам не нужны тысячи предметов в вашем IN, то решение Алекса - это способ сделать это (и похоже, как это делает Django).

0
задан Arya 19 March 2019 в 12:26
поделиться

4 ответа

Попробуйте 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
ответ дан stack0114106 19 March 2019 в 12:26
поделиться

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

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
ответ дан Oliver Gaida 19 March 2019 в 12:26
поделиться

Не могли бы вы попробовать следующее. Просто установите правильные 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
ответ дан RavinderSingh13 19 March 2019 в 12:26
поделиться

Вы можете использовать одну команду 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
ответ дан Wiktor Stribiżew 19 March 2019 в 12:26
поделиться
Другие вопросы по тегам:

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