3つのファイルがあり、file1.txt
フォーマットは同じです(データタイプは同じで、列数は同じです)。file2.txt
file3.txt
列2と列3をそれぞれ比較して、出力ファイルfile1.txt
に存在しないレコードを選択したいと思いますfile2.txt
。これを行う方法をお手伝いできますか?file3.txt
out.txt
入力例:
file1.txt
abc 1 a f11 f13 f14
abd 2 b f12 f14 f13
abe 4 d f13 f16 f12
acf 6 s f14 f15 f19
file2.txt
abc 1 a f21 f23 f24
abd 1 b f21 f24 f23
abe 4 d f24 f26 f22
acf 6 s f23 f25 f29
file3.txt
abc 1 a f31 f33 f34
abd 3 b f31 f34 f33
acf 6 s f33 f35 f39
abe 3 d f34 f36 f32
希望の出力
out.txt
abd 2 b f12 f14 f13
この行に加えて、他の行がに存在しますfile2.txt
。file3.txt
答え1
そんなに好きならawk
awk '
FILENAME != ARGV[3] {
m[$2,$3] = 1
next
}
!(($2,$3) in m)
' file3.txt file2.txt file1.txt > out.txt
私には簡単なことです。
cut -d" " -f 2,3 file2.txt file3.txt | grep -v -f - file1.txt > out.txt
答え2
考えられる解決策awk
:
awk 'FILENAME == ARGV[1] {
m[$2,$3] = $0;
next;
}
FILENAME == ARGV[2] {
if (!(($2,$3) in m)) {
m[$2,$3] = $0;
}
next;
}
{
if (!(($2,$3) in m)) {
print $0 >"out.txt";
}
}' file3.txt file2.txt file1.txt
まず、最初のファイルを読み取り、列2と3のキーを含む配列を作成します。
次に、2番目のファイルを読み取り、列2と3のキーが最初の配列にあることを確認し、そうでない場合は配列に追加します。
最後に、最初のファイルを読み取り、配列にキーがあることを確認します。そうでない場合、興味のある行はその行です。
出力.txt最初のファイルには、他の2つのファイルには表示されない行を含める必要があります。
abd 2 b f12 f14 f13