我有一个文件,我想在其中找到第三列和第四列不同的所有行。我的文件如下所示:
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 中应该是正确的
可能出了什么问题?
虽然我无法重现您的问题(见下文),但我认为您正在以数字而不是字符串的形式评估这些值(所有非空字符串 - 甚至"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}'
相同...但请确保你没有让代码更难让你的同行阅读。