我有一个文本文件,每行包含不同数量的列。
如果该行的第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列中。括号中的数字可以是单个数字。
答案 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
上面的这一行确实:
以你的例子:
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