模式匹配后如何 awk 第 n 列?

模式匹配后如何 awk 第 n 列?

我有一个数据文件 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-

相关内容