キー値に基づいて2つのファイルを比較し、ファイル1に一致しないレコードを印刷したいと思います。使用される区切り記号はパイプです。|
- 出力は次のとおりです
I|234567|BCDE|234TFY|abc|12345
- ファイル1:
主な列:列2と列5I|123456|ABCD|123abc|xyz|23456 I|234567|BCDE|234TFY|abc|12345
- ファイル2:
主な列:列1と列4xyz|P|1001|123456 bcd|P|1001|123467
誰でも正しいアプローチが何であるかを提案できますか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.txt
2と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にあることを確認する必要があります。