如何仅在awk中打​​印带有数字的某些列

时间:2013-01-15 00:18:43

标签: awk

我有一个文本文件,每行包含不同数量的列。

如果该行的第3,4和5列只包含数字,我只想打印行。

诀窍有时候第3,4和5列会在其中嵌入一个特殊字符“(”或“)”,我也想打印这些数字。

cat $filename | awk '{ if ( ($3 != "^[0-9]") && ($4 != "^[0-9]") && ($5 != "^[0-9]") ) print $2, $3, $4, $5 }' >>text.dat

但它也打印了诸如:Au2,Cu2等

有什么建议吗?

更新:

输入文本文件的相关部分如下所示:

Cu1 Cu 0.00000 0.094635(14) 0.094635(14)
Cu2 Cu 0.00000 0.125943(15) 0.125943(15)
.
.
.

我想要的是以下内容:

Cu 0.00000 0.094635 0.094635
Cu 0.00000 0.125943 0.125943
.
.
.

请注意,“Cu”来自原始输入文件的第二列中的字符串,我已经删除了第4列和第5列中的数字和括号。另请注意,括号也可以存在于第3列中。括号中的数字可以是单个数字。

1 个答案:

答案 0 :(得分:1)

代码:

 ($3 != "^[0-9]") && ($4 != "^[0-9]") && ($5 != "^[0-9]") 

!=表示not equal to它不进行正则表达式匹配测试。

尝试$3~/[0-9]+/ && $4~/[0-9]+/等等

代表()问题 您可以做的是,在检查$ 2 $ 3 $ 4的正则表达式匹配之前,用( or )替换这些字段中的所有"",然后进行匹配测试。

我希望上面的解释足够清楚。

修改

awk '{for(i=3;i<=5;i++)gsub(/\([^\)]*\)/,"",$i)}$3~/[0-9\.]*/&&$4~/[0-9\.]*/&&$5~/[0-9\.]*/' file

上面的这一行确实:

  • 从$ 3,$ 4,$ 5
  • 中删除(...)
  • 检查$ 3,$ 4,$ 5是否为数字(或十进制)。
  • 如果是,则打印出来

以你的例子:

kent$  echo "Cu1 Cu 0.00000 0.094635(14) 0.094635(14)
Cu2 Cu 0.00000 0.125943(15) 0.125943(15)"|awk '{for(i=3;i<=5;i++)gsub(/\([^\)]*\)/,"",$i)}$3~/[0-9\.]*/&&$4~/[0-9\.]*/&&$5~/[0-9\.]*/'                                               
Cu1 Cu 0.00000 0.094635 0.094635
Cu2 Cu 0.00000 0.125943 0.125943

只需$ 2,$ 3,$ 4,$ 5:

awk '{for(i=3;i<=5;i++)gsub(/\([^\)]*\)/,"",$i);if($3~/[0-9\.]*/&&$4~/[0-9\.]*/&&$5~/[0-9\.]*/)print $2,$3,$4,$5}' file