Согласно http://www.sqlite.org/limits.html (пункт 9), SQLite не может (по умолчанию) обрабатывать более 999 параметров для запроса, поэтому решения здесь (генерирование нужного списка заполнителей) не удастся, если у вас есть тысячи предметов, которые вы ищете IN
. Если это так, вам нужно будет разбить список, затем перебрать его части и объединить результаты самостоятельно.
Если вам не нужны тысячи предметов в вашем IN
, то решение Алекса - это способ сделать это (и похоже, как это делает Django).
Попробуйте 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: с Perl, $ 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 -lne ' /(.+?)\/(.+?)\s+.+?(\d+).+?(\d+)/ ? print $1,": ",$3,"\n",$2,": ",$4 : print ' scores.csv
Min: 70
Max: 290
Average Inference Time : 90 ms
$
Первое, что вы могли бы разделить пробелом и косой чертой. И посмотрите на каждый элемент:
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
Не могли бы вы попробовать следующее. Просто установите правильные 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
Вы можете использовать одну команду 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.