awk字符串不等式似乎不起作用

时间:2014-02-06 08:12:22

标签: bash awk

我有一个文件,我想找到第三列和第四列不同的所有行。我的文件看起来像:

chr1:109506687  [T/G]   BOT     TOP
chr1:109506690  [T/G]   BOT     TOP
...

我用来查找这些行的代码是

awk '$3 != $4 {print $0}' Cardio-Metabo_Chip_11395247_A.txt | shuf -n 10

问题是使用此命令我得到的结果如

rs3218791       [A/C]   TOP     TOP

第三栏和第四栏是相同的。

当我使用条件进行相等时,即==我得不到输出,这告诉我awk从不认为两列$ 3和$ 4相等,尽管它们经常是这样。

聚苯乙烯。在vim中使用:set list,我的文件看起来像:

chr1:109506687^I[T/G]^IBOT^ITOP$
chr1:109506690^I[T/G]^IBOT^ITOP$
....

我的awk版本是GNU Awk 3.1.8,但我无法想象必须做任何事情。这应该是正确的1.0

可能出现什么问题?

1 个答案:

答案 0 :(得分:3)

虽然我无法重现你的问题(见下文),但我认为你是用数字而不是字符串来评估这些值(所有非空字符串 - 即"0" - 数字评估为1) 。试试这个:

awk '$3 != $4 "" {print $0}' test

$4连接成一个空字符串,因此应强制进行所需的字符串比较。


我没能用mawk 1.2和gawk 4.0.1重现你的问题:

$ cat test
chr1:109506687  [T/G]   BOT     TOP
chr1:109506690  [T/G]   BOT     TOP
rs3218791       [A/C]   TOP     TOP
$ mawk '$3 != $4 {print $0}' test
chr1:109506687  [T/G]   BOT     TOP
chr1:109506690  [T/G]   BOT     TOP
$ gawk '$3 != $4 {print $0}' test
chr1:109506687  [T/G]   BOT     TOP
chr1:109506690  [T/G]   BOT     TOP

shuf管道不应该与它有任何关系,标签与空格也不应该有关系。 (虽然为了安全起见,我在测试中尝试了所有组合。)

有趣的提示:如果只有一个条款没有动作,则隐含{print $0}。因此,awk '$3 != $4'awk '$3 != $4 {print $0}'相同......但请确保您不会让同事更难以阅读。