在awk中删除列中的部分数据

Remove part of the data in a column in awk

我在文件中有列

  1 11469   12272   ABCD:E1.121 +

我希望输出为

  1 11469   12272   ABCD:E1 +

我试过了

  awk '{ sub(/./,"",); print }' file 

我得到了类似

的东西
 1  11469   12272   BCD:E1.121 +

而不是我想要的

 1  11469   12272   ABCD:E1 +

注意 . 是正则表达式中的一个元字符;它匹配任何字符(换行符除外)。这就是 A 消失的原因。您需要像 /\.[0-9]+/ 这样的正则表达式,以消除小数点和后面的数字。

$ cat data
  1 11469   12272   ABCD:E1.121 +
$ awk '{ sub(/./,"",); print }' data             # Original script; wrong output
1 11469 12272 BCD:E1.121 +
$ awk '{ sub(/\.[0-9]+/, "", ); print }' data    # Modified script; right output
1 11469 12272 ABCD:E1 +
$

请注意,我假设您要从字段 4 的末尾删除 'fraction' — 一个小数点和一些数字。基于一行示例数据,这是可行的。如有必要,您可以优化正则表达式以匹配数据中的其他模式并适当修改它们。例如,您可以在加号后添加一个 $ 以表示 'decimal point and digits to end of field',这样 ABCD:E1.234X 就不会变成 ABCD:E1X

awk '{sub(/E1.121 \+/,"E1 +")}1' file
1 11469   12272   ABCD:E1 +