【问题标题】:How to implement this in awk or shell?如何在 awk 或 shell 中实现这一点?
【发布时间】:2013-02-26 14:09:51
【问题描述】:

输入文件1:

5 5 NA
NA NA 1
2 NA 2

输入文件2:

1 1 1
2 NA 2
3 NA NA
NA 4 4
5 5 5
NA NA 6

输出:

3 NA NA
NA 4 4
NA NA 6

目的是:在 file1 中,将每一行中不属于NA 的任何一项设置为一个集合,然后在 file2 中,消除其字段在该集合内的行。有人对此有想法吗?

【问题讨论】:

  • 为什么输出中没有1 1 1
  • @dogbane 因为1 在file1 中显示为NA NA 1
  • 那你为什么说“设置第一个项目......那不是NA”? 1 不会作为File1 中任何行的第一个元素出现。
  • 啊...你的意思是“在File1的每一行中,找到第一个不是NA的条目并将其添加到要删除的元素集中”。
  • File1 中的每一行都有一个 NA。您是否只想删除 File2 中包含出现在 File1 中任何位置的数字的所有行?

标签: perl shell join sed awk


【解决方案1】:

添加 任何 项不是“NA”:

awk -f script.awk file1 file2

script.awk的内容:

FNR==NR {
    for (i=1;i<=NF;i++) {
        if ($i != "NA") {
            a[$i]++
        }
    }
    next
}

{
    for (j=1;j<=NF;j++) {
        if ($j in a) {
            next
        }
    }
}1

结果:

3 NA NA
NA 4 4
NA NA 6

或者,这里是单行:

awk 'FNR==NR { for (i=1;i<=NF;i++) if ($i != "NA") a[$i]++; next } { for (j=1;j<=NF;j++) if ($j in a) next }1' file1 file2

【讨论】:

    【解决方案2】:

    您可以使用grep

    $ egrep -o '[0-9]+' file1 | fgrep -wvf - file2
    3 NA NA
    NA 4 4
    NA NA 6
    

    【讨论】:

      【解决方案3】:

      awk 单行:

       

      awk 'NR==FNR{for(i=1;i<=NF;i++)if($i!="NA"){a[$i];break} next}{for(i=1;i<=NF;i++)if($i in a)next;}1' file1 file2
      

      使用您的数据:

      kent$  awk 'NR==FNR{for(i=1;i<=NF;i++)if($i!="NA"){a[$i];break;} next}{for(i=1;i<=NF;i++)if($i in a)next;}1' file1 file2
      3 NA NA
      NA 4 4
      NA NA 6
      

      【讨论】:

        【解决方案4】:

        如果值的列位置很重要:

        awk '
          NR==FNR{
            for(i=1; i<=NF; i++) if($i!="NA") A[i,$i]=1
            next
          }
          {
            for(i=1; i<=NF; i++) if($i!=NA && A[i,$i]) next
            print 
          }
        ' file1 file2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-21
          相关资源
          最近更新 更多