File1の列3をFile2の列2と比較したいです。 File1の列3の値がFile2の列2に表示されない場合は、File1の行全体を印刷します。
ファイル1:
5/3/2021 Mobile $2,627.59
5/3/2021 Phone $2,056.11
5/3/2021 Loan $5,146.11
ファイル2:
5/11/2021 $2,627.59
5/12/2021 $2,056.11
5/15/2021 $7,516.11
5/13/2021 $406.11
5/12/2021 $2,056.11
希望の出力:
5/3/2021 Loan $5,146.11
答え1
awk '
NR==FNR{ values[$2]; next }
!($3 in values)
' File2 File1
まず、File2
配列の2番目のフィールドを読み取り、それをvalues
インデックスとして保存します。このテストは、NR==FNR
空でない最初の入力ファイルでのみ機能します。スクリプトはnext
次のコード行をスキップして記録を続けます。
次に、File1
3番目のフィールドが配列のインデックスとして表示されないことを読み、確認しますvalues
。 trueの場合、現在のレコードを印刷します(デフォルトの動作)。
答え2
プロセス置換でシェルを使用する(シェルがそうでない場合は、まずファイルを個別にソートしてください<(...)
):
join -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
<( sort -b -k 3,3 File1 ) \
<( sort -b -k 2,2 File2 )
最初のデータセットの3番目の列(-1 3
)と他のデータセットの2番目の列()を結合フィールドとして、ソートされた2つの-2 2
データセット間でリレーショナルJOIN操作を実行します。指定したオプションに応じて、join
最初のファイルの最初、2番目、3番目の列が出力されます-o
。 2番目のファイル()のどの行にも接続できない最初のファイルの行のみを出力します-v 1
。
join
sort -b
入力は、結合フィールドとして使用される列を使用してソートする必要があります。これは、2つのプロセス置換が実行するアクションです。
与えられたデータを使用した出力は次のとおりです。
5/3/2021 Loan $5,146.11
ファイルがタブをフィールド区切り文字として使用する場合は、次のものを使用できます。
join -t $'\t' -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
<( sort -t $'\t' -b -k 3,3 File1 ) \
<( sort -t $'\t' -b -k 2,2 File2 )