以awk分隔值

时间:2019-03-19 12:07:40

标签: awk sed

我坚持方法需要在/之前和/之后分隔值 这是文件内容:

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}'

但是,对于上述预期输出,我不区分/之前和/之后的值。

4 个答案:

答案 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 

请参见online sed demo

模式详细信息

  • .*\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