キー値に基づいてレイアウトが異なる2つのファイルを比較し、出力を3番目のファイルに抽出します。

キー値に基づいてレイアウトが異なる2つのファイルを比較し、出力を3番目のファイルに抽出します。

キー値に基づいて2つのファイルを比較し、ファイル1に一致しないレコードを印刷したいと思います。使用される区切り記号はパイプです。|

  • 出力は次のとおりです
    I|234567|BCDE|234TFY|abc|12345
    
  • ファイル1:
    I|123456|ABCD|123abc|xyz|23456
    I|234567|BCDE|234TFY|abc|12345
    
    主な列:列2と列5
  • ファイル2:
    xyz|P|1001|123456
    bcd|P|1001|123467
    
    主な列:列1と列4

誰でも正しいアプローチが何であるかを提案できますかawk

答え1

これを行うには、次のプログラムを使用できますawk

awk -F'|' 'FNR==NR{key1[FNR]=$1;key2[FNR]=$4;next}
           {if ($2!=key2[FNR] || $5!=key1[FNR]) print}' file2.txt file1.txt 
  • まず、file2.txt各行の列1と4のリストを解析して作成します。ファイルFNRごとのラインカウンタがグローバルNRラインカウンタ(しかし、参考にしてください空になると破壊されますfile2.txt! )。
  • その後、解析時に各行の列file1.txt2と5の処理中に入力されたリストと比較し、一致しない場合はfile2.txt行を印刷します。

答え2

次のように試すことができます。

while read -r line;
do
myvar2=$(line | awk '{ print $2}')
if grep -Fxq "$myvar" file2
then
# code if found
else
# code if not found
fi
myvar5=$(line | awk '{ print $5}')
if grep -Fxq "$myvar5" file2
then
# code if found
else
# code if not found
fi
done < file1

コードはテストされていません。これはfile1から1行ずつ読み、列2で区切って列5で区切る必要があり、 awk '{ print $2 $5}'2と5を読み、myvarがfile2にあることを確認する必要があります。

関連情報