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

Bash awk字符串不等式似乎不起作用,bash,awk,Bash,Awk,我有一个文件,我想找到第三列和第四列不同的所有行。我的文件看起来像: chr1:109506687 [T/G] BOT TOP chr1:109506690 [T/G] BOT TOP ... chr1:109506687^I[T/G]^IBOT^ITOP$ chr1:109506690^I[T/G]^IBOT^ITOP$ .... 我用来查找这些行的代码是 awk '$3 != $4 {print $0}' Cardio-Metabo_Chip_11395247

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

chr1:109506687  [T/G]   BOT     TOP
chr1:109506690  [T/G]   BOT     TOP
...
chr1:109506687^I[T/G]^IBOT^ITOP$
chr1:109506690^I[T/G]^IBOT^ITOP$
....
我用来查找这些行的代码是

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  [T/G]   BOT     TOP
chr1:109506690  [T/G]   BOT     TOP
...
chr1:109506687^I[T/G]^IBOT^ITOP$
chr1:109506690^I[T/G]^IBOT^ITOP$
....
我的awk版本是GNUAWK3.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{打印$0}'
。。。不过,请确保您没有让您的同事更难阅读代码。

我在OSX上尝试了这一点(无法尝试shuf-n 10部分),但在运行命令时rs3218791没有出现。是否可能它与
^I
匹配,这就是我所能看到的可能的原因。是的,可能是awk认为制表符和换行符是列值的一部分,但这很奇怪。默认情况下,制表符也是一个类似分隔符的空格,所以这不是问题所在。不幸的是,我也无法在OSX上尝试
shuf
。您也可以尝试使用
~
~
代替
=查看它的功能。!~ ~做了与=,相同的事情,但是谢谢你的建议。