2

入力ファイル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で、フィールドがこのセット内にある行を削除します。誰かがこれについてアイデアを持っていますか?

4

4 に答える 4

2

'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
于 2013-02-26T14:22:12.540 に答える
2

あなたはこれを行うことができますgrep

$ egrep -o '[0-9]+' file1 | fgrep -wvf - file2
3 NA NA
NA 4 4
NA NA 6
于 2013-02-26T14:28:29.400 に答える
0

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
于 2013-02-26T14:25:28.780 に答える
0

値の列の位置が重要な場合:

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
于 2013-02-26T16:30:02.910 に答える