删除awk中列的部分数据

时间:2016-01-08 19:14:09

标签: awk delimiter gsub

我在文件中有列

  1 11469   12272   ABCD:E1.121 +

我希望输出为

  1 11469   12272   ABCD:E1 +

我试过

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

我得到像

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

而不是我想要的,这是

 1  11469   12272   ABCD:E1 +

2 个答案:

答案 0 :(得分:2)

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

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

请注意,我已经假设你要删除一个'分数' - 小数点和字段末尾的一些数字4.根据一行样本数据,这是有效的。如有必要,您可以优化正则表达式以匹配数据中的其他模式并适当地修改它们。您可以在加号后面添加$以指示'小数点和数字到字段结尾'因此,ABCD:E1.234X不会成为ABCD:E1X,例如。

答案 1 :(得分:0)

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