将多个切割操作合二为一

时间:2017-01-06 05:28:55

标签: bash awk sed cut

我有输入文件:

$ cat bleu.out 
BLEU = 16.67, 54.4/26.8/14.9/8.2 (BP=0.813, ratio=0.828, hyp_len=8982, ref_len=10844)
BLEU = 17.56, 55.1/27.6/15.8/9.4 (BP=0.804, ratio=0.821, hyp_len=8905, ref_len=10844)
BLEU = 17.95, 54.4/27.5/15.6/9.1 (BP=0.837, ratio=0.849, hyp_len=9206, ref_len=10844)
BLEU = 19.10, 54.8/28.1/16.3/9.7 (BP=0.860, ratio=0.869, hyp_len=9423, ref_len=10844)
BLEU = 19.29, 53.0/26.6/15.1/8.9 (BP=0.925, ratio=0.928, hyp_len=10058, ref_len=10844)
BLEU = 18.70, 55.7/28.7/16.4/9.4 (BP=0.839, ratio=0.851, hyp_len=9223, ref_len=10844)
BLEU = 18.63, 55.2/28.1/16.3/9.8 (BP=0.834, ratio=0.846, hyp_len=9178, ref_len=10844)
BLEU = 18.41, 54.2/27.4/15.5/9.2 (BP=0.857, ratio=0.867, hyp_len=9398, ref_len=10844)
BLEU = 18.70, 53.7/26.9/15.7/9.3 (BP=0.871, ratio=0.878, hyp_len=9526, ref_len=10844)

但是,当我需要删除某个列时,让我们说第一个逗号之后的第一列,我必须使用cut的多个实例,例如:

$ cat bleu.out | cut -f1 -d',' | cut -f3 -d ' '
16.67
17.56
17.95
19.10
19.29
18.70
18.63
18.41
18.70

有没有办法在一个cut实例中按顺序排序多个cut条件?例如。像cut-multi.sh -f1 -d',' -f3 -d' '之类的东西?

如果不是,那么执行cut -f1 -d',' | cut -f3 -d' '相同操作的其他方法是什么?我们也欢迎使用awksed或类似内容。

5 个答案:

答案 0 :(得分:4)

您可以在awk

中指定多个字段分隔符
$ awk -F'= *|,' '{print $2}' bleu.out
16.67
17.56
17.95
19.10
19.29
18.70
18.63
18.41
18.70
  • -F'= *|,'指定=后跟零或更多空格或,作为字段分隔符
  • {print $2}打印第二栏

答案 1 :(得分:3)

使用grep和perl的外观功能进行解决方案。这将在=和第一,之间打印文字。

grep -oP '= \K.*?(?=,)' input
16.67
17.56
17.95
19.10
19.29
18.70
18.63
18.41
18.70

或者根据Sundeep的建议:

 grep -oP '= \K[^,]+' input

答案 2 :(得分:2)

使用sed:

$ sed 's/^[^=]*= \([^,]*\).*/\1/' bleu.out
16.67
17.56
17.95
19.10
19.29
18.70
18.63
18.41
18.70

这会在第一次出现\([^,]*\)(以及空格)(=)后捕获所有不是逗号(^[^=]*=)的逗号,并替换为捕获组(\1)。

答案 3 :(得分:0)

awk的另一种解决方案:

awk '{sub(/,$/, "", $3); print $3}' bleu.out

,字段中删除最后一个3rd并打印出来。

答案 4 :(得分:0)

awk -F'[ = ,]' '{print $4}' file
16.67
17.56
17.95
19.10
19.29
18.70
18.63
18.41
18.70