2つのファイルの列1〜5を一致させ、一致する列1〜5だけでなく、ファイル1の列6と7、ファイル2の列6を印刷します。

2つのファイルの列1〜5を一致させ、一致する列1〜5だけでなく、ファイル1の列6と7、ファイル2の列6を印刷します。

2つのファイルの1〜5列を一致させ、1〜5列、ファイル1の6列と7列、ファイル2の6列を印刷しようとしています。両方のファイルで一致しない行は、一致しない列にもNA値を印刷する必要があります。

file1

12  800000  900000  66  73  0   0  
12  900000  1000000 73  48  2   2  
13  1000000 1100000 11  11  0   0  
12  1100000 1200000 12  12  0   0  
18  1400000 1600000 33  33  3   3  

file2

12  800000  900000  66  73  145(28.12)  
12  900000  1000000 73  48  703(51.17)  
13  1000000 1100000 11  11  545(43.99)  
12  1100000 1200000 12  12  699(45.30)
14  16100000    16200000    0   0   11(14.50)  
14  16200000    16300000    0   0   0    

Expected output

12  800000  900000  66  73  145(28.12)  0  0   
12  900000  1000000 73  48  703(51.17)  2  2  
13  1000000 1100000 11  11  545(43.99)  0  0  
12  1100000 1200000 12  12  699(45.30)  0  0  
14  16100000  16200000  0  0  11(14.50)  NA  NA 
14  16200000  16300000  0  0  0  NA  NA  
18  1400000 1600000 33  33  NA  3   3

以下のawkコマンドを試しましたが、両方のファイルから列を取得できませんでした。

awk 'FNR==NR{A[$1 FS $2 FS $3 FS $4 FS $5]=$3;next}{print ($1 FS $3 FS $4 FS $5 in A ) ? $0 OFS A[$1 FS $3 FS $4 FS $5] : $0 OFS "NA"}' file1 file2

ベストアンサー1

コードが説明と一致しません。たとえば、後で印刷するために$ 3をfile1に保存しますが、$ 4と$ 6を印刷しようとすると、予想される出力はそれらのどれとも一致せず、代わりに$ 6のfile1を表示します。そして7ドル。したがって、期待される結果に基づいてこれが欲しいものだと思います。

$ cat tst.awk
{ key = $1 OFS $2 OFS $3 OFS $4 OFS $5 }
FNR==NR {
    file1[key] = $6 OFS $7
    next
}
{
    print $0, (key in file1 ? file1[key] : "NA" OFS "NA")
    delete file1[key]
}
END {
    for ( key in file1 ) {
        print key, "NA", file1[key]
    }
}

$ awk -f tst.awk file1 file2
12  800000  900000  66  73  145(28.12) 0 0
12  900000  1000000 73  48  703(51.17) 2 2
13  1000000 1100000 11  11  545(43.99) 0 0
12  1100000 1200000 12  12  699(45.30) 0 0
14  16100000    16200000    0   0   11(14.50) NA NA
14  16200000    16300000    0   0   0 NA NA
18 1400000 1600000 33 33 NA 3 3

両方のファイルのキーインデックスを維持するために変数を使用することに注意してください。値で構成されたキーがある場合は、間違えやすいので、コードに何度も書き込もうとしないでください$2。 )でもう一度申し上げます。$1 FS $3 FS $4 FS $5 in A$1 FS $2 FS $3 FS $4 FS $5 in AA[$1 FS $3 FS $4 FS $5]

また、 - 組み込み変数名との競合を避けるために、変数名をすべて大文字にしないでください(例A:)。コードをより明確にするために括弧を使用してください(他に何もない場合)。例: idk if$1 FS $2 in A手段 (例: 照会結果との接続($1 FS) ($2 in A)) または (つまり、接続結果) などを探します。しかし、単に書くことは明確であいまいではありません。$1 FS$2 in A($1 FS $2) in A$1 FS $2A($1 FS $2) in A

OFS最後に、配列インデックス区切り文字としてnotを使用していることに注意してくださいFS。これは、コード内ENDのそのセクションの値を印刷し、出力フィールドを区切る必要がある項目ではOFSないためですFS。この場合、両方とも空白文字なので違いを見ることはできませんが、CSVを出力するには私のコードを使って追加すると-v OFS=','そのまま動作します。配列インデックス付き添字の間で使用している場合は、FSそれを変更する必要があります。

おすすめ記事