我有一个数据文件 file1.txt,我想匹配一个模式(“最佳拟合点:”或“最佳拟合”),然后打印该行的最后一列。
文件1.txt
best-fit point: 0.0000 0.0000 0.0000 x coordinate 0.0000
best-fit point: -0.4330 -0.2500 0.0884 x coordinate 0.5078
best-fit point: 0.8660 0.5000 -0.1768 x coordinate 2.0310
best-fit point: -0.4330 0.2500 0.1768 x coordinate 3.4003
best-fit point: 0.8660 1.0000 -0.0884 x coordinate 4.9236
best-fit point: 0.4330 0.7500 0.0000 x coordinate 5.4313
best-fit point: 0.8660 -0.5000 -0.3536 x coordinate 6.8006
best-fit point: 0.0000 0.0000 0.2652 x coordinate 7.9766
best-fit point: 1.2990 0.7500 0.0000 x coordinate 9.4998
best-fit point: 0.8660 0.5000 0.0884 x coordinate 10.0076
best-fit point: 1.2990 -0.7500 -0.2652 x coordinate 11.3769
best-fit point: 0.8660 -1.0000 -0.1768 x coordinate 11.8846
best-fit point: 0.0000 0.0000 -0.5303 x coordinate 13.2539
输出
0.0000
0.5078
2.0310
3.4003
4.9236
5.4313
6.8006
7.9766
9.4998
10.0076
11.3769
11.8846
13.2539
我的解决方案及其问题
awk '/best-fit point:/{i==0 ; i++; print "K"i"="$8}' file-1.txt
如果任何列中没有负数据,则该 awk 命令成功运行。有没有其他方法可以在模式匹配后打印最后一列?
提前致谢!
答案1
如果您输入的最后一列始终与前一列分开,您可以要求 AWK 通过引用字段数来输出最后一列:
awk '/best-fit point:/ { printf "%7.4f\n", $NF }'
将产生您问题中所示的输出。
然而,您的输入似乎确实使用了固定宽度的列。如果您使用 GNU AWK,则可以使用FIELDWIDTHS
指定列:
awk -vFIELDWIDTHS="21 7 7 7 16 8" '/best-fit point:/ { printf "%7.4f\n", $6 }'
答案2
和grep
:
grep 'best-fit' file.txt | grep -Eo ' .[^ ]*$'
仅选择“最适合”的行,然后将其减少为“[空格]字符串[行结束]”。
如果您的格式与输入中的格式一样固定,您也可以只剪切字符范围
grep 'best-fit' file.txt | cut -c60-