【问题标题】:awk string inequality seemingly not workingawk 字符串不等式似乎不起作用
【发布时间】:2014-02-08 03:41:47
【问题描述】:

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

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 中应该是正确的

可能出了什么问题?

【问题讨论】:

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

标签: bash awk


【解决方案1】:

虽然我无法重现您的问题(见下文),但我认为您正在以数字方式而不是字符串来评估这些值(所有非空字符串 - 甚至 "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}' 相同……但请确保您不会使代码更难让您的同行阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多