我有输入文件:
$ 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' '
相同操作的其他方法是什么?我们也欢迎使用awk
,sed
或类似内容。
答案 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