0

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

如果该行的第 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 列中。括号中的数字可以是个位数。

4

1 回答 1

1

在您的代码中:

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

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

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

对于(or)问题,您可以做的是,在检查 $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
于 2013-01-15T00:27:55.177 回答