首页 > 解决方案 > 比较同一文件中的多个列

问题描述

我想比较同一文件中的多个列,以查看我在哪一行有差异,在本例中为前 4 列。该文件如下所示:

           Column1 Column2 Column3 Column4 Column5
              AA      AA      AA      AA    AA
              GG      GG      GG      GG    GG
              CC      GC      CC      CC    CC
              CC      TT      CC      GC    TT

如果我做了这样的事情:

 awk -F"\t" '{if ($1==$2) print $1, $2; else print NR}' file.txt 

我得到下一个输出:

             1
             AA      AA 
             GG      GG 
             4
             5

但是,我如何用简单的语法同时比较前 4 列?我试过这样的事情:

       awk -F"\t" '{if ([$2,$3,$4]==$1) print $1, $2, $3, $4 ; else print NR}' File.txt

但它不工作。

我的预期输出应该是:

              1 
              AA      AA      AA      AA
              GG      GG      GG      GG
              4
              5

我的文件有超过四列,所以我想比较列组,在这种情况下从第 1 列到第 4 列,如果它们具有相同的字符,则只打印这四列,如果它们有差异,则只打印行数。

我怎么能做到这一点?

标签: bashawk

解决方案


我会使用循环来逐步浏览您的列:

$ awk '{x=0;for(i=1;i<NF;i++){if($i!=$(i+1)){x=1}} print x?NR:$0}' input.txt

或者,为了便于阅读:

{
  x=0                     # initialize the flag for each line
  for (i=1;i<NF;i++) {    # step through the fields
    if ($i!=$(i+1)) {     # test for a match with the next field
      x=1                 # and set a flag if we see different content.
    }
  }
  print x ? NR : $0       # print NR or the first field depending on flag value
}

这将遍历所有字段(不仅仅是四个),将每个字段的内容与其后字段的内容进行比较。如果在任何时候字段不匹配,则会设置一个标志。

最后一条语句中的三元运算符根据标志选择要显示的输出。

请注意,您的预期输出似乎从行首修剪了空格。如果你真的想要这个,你可以sub(/^[[:space:]]+/,"")print声明之前。


推荐阅读