我坚持方法需要在/
之前和/
之后分隔值
这是文件内容:
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 :(得分:3)
尝试使用带有多个分隔符的awk
$ echo "Min/Max Inference Time : 70 ms / 290 ms" | \
awk -F"[/ ]+" ' { print $1, ":", $(NF-3); print $2,":",$(NF-1) } '
Min : 70
Max : 290
$
EDIT1: FS不应更改
$ echo "Min/Max Inference Time : 70 ms / 290 ms" | awk -F: -v OFS=":" ' { split($1,a,"[ /]+"); split($2,b,"ms|/"); print a[1],b[1]; print a[2],b[3] } '
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
$
答案 1 :(得分:1)
您可以使用单个sed
命令:
sed -E 's,.*\b([0-9]+[[:blank:]]*ms)[[:blank:]]*/[[:blank:]]*([0-9]+[[:blank:]]*ms).*,Min : \1\nMax : \2,' scores.csv > new_scores.csv
模式详细信息
.*\b
-尽可能多的0+个字符,直至单词边界,后跟后续模式
([0-9]+[[:blank:]]*ms)
-第1组:1个或多个数字,0 +空格,ms
子字符串[[:blank:]]*/[[:blank:]]*
-一个/
包含0个或多个空格([0-9]+[[:blank:]]*ms)
-第2组:1个或多个数字,0 +空格,ms
子字符串.*
-该行的其余部分。替换模式为Min : \1\nMax : \2
,其中\1
代表用组1捕获的文本,\2
代表用组2捕获的文本。
答案 2 :(得分:1)
您可以使用空格和斜线分割的第一件事。并查看每个元素:
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
答案 3 :(得分:1)
能否请您尝试以下。只需为每行设置适当的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