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