3つのファイル比較:列比較を使用すると、あるファイルには行がありますが、他のファイルにはありません。

3つのファイル比較:列比較を使用すると、あるファイルには行がありますが、他のファイルにはありません。

3つのファイルがあり、file1.txtフォーマットは同じです(データタイプは同じで、列数は同じです)。file2.txtfile3.txt

列2と列3をそれぞれ比較して、出力ファイルfile1.txtに存在しないレコードを選択したいと思いますfile2.txt。これを行う方法をお手伝いできますか?file3.txtout.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.txtfile3.txt

この投稿が仕事に役立つと思います3つのファイル比較する2つのファイル。

答え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

関連情報