Linuxの熱比較

Linuxの熱比較

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次のコード行をスキップして記録を続けます。

次に、File13番目のフィールドが配列のインデックスとして表示されないことを読み、確認します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

joinsort -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 )

関連情報