awkを使用して2つのファイルの列を並べ替える

awkを使用して2つのファイルの列を並べ替える

2つの入力ファイルがあります

28a39a289906c01159f999a68996091a [email protected]
274d1d2c7e931fb55ac0c91dd41f2be7 [email protected]
44d25d3b1b70b240d5058f1be1cef576 [email protected]
2227a768f6d253b7bf81bb4ecb15b52d [email protected]

そして

28a39a289906c01159f999a68996091a
274d1d2c7e931fb55ac0c91dd41f2be7
44d25d3b1b70b240d5058f1be1cef576
2227a768f6d253b7bf81bb4ecb15b52d

ファイル2のファイル1に一致する列1を持つファイル1のすべての行を除外しようとしています。

md5阻害。

私が見つけることができるものawk 'NR==FNR{a[$1]=$0;next}{print a[$2]}' $1 $2

私はそれがかなり近いことを知っていますが、私が今やりたいことをする前に何をしたのかよくわかりません。

答え1

順序が重要ではなく(たとえば、ファイルにmd5を含むすべての電子メールを除く)、awkが気に入らない場合は、次のようにします。join:

join -v 1 -j 1 <(sort emails) <(sort excludes)

-v 12番目のファイル(除外)に、対応する行がない最初のファイル(電子メール)の行を印刷するように指示します。
-j 1 それぞれの最初の列のみを表示するように指示します。


awkを使用するには、次の作業が必要だと思います。

awk 'NF==1{exclude[$1]++} NF==2&&!exclude[$1]' excludes emails

または、2つのファイルが1行ずつ一致し、2行だけを除外する場合(たとえば、両方のファイルがその特定の行に同じハッシュがある場合)、次のように使用します。

awk 'NF==1{hash[FNR]=$1} NF==2&&hash[FNR]!=$1' excludes emails

答え2

これの利点は、ファイルを任意の順序で並べ替えることができることです。

sort file1 file2 | uniq -u --check-chars 32 | grep -E '.{33}'

sort file1 file2uniqを準備するためにファイルを結合してソートしています。

uniq -u --check-chars 32最初の32文字のみが考慮され、使用時に-u一意の行のみが印刷されます。

grep -E '.{33}'33文字以上の文字を含む行のみが印刷されます。

編集する

Peter.Oが指摘したように、これは進まなかったファイルリスト内の複数の項目が同じmd5を持つ状況。この場合、そのファイルは印刷されません。私はjoinこのソリューションが一番好きです。

しかし、この論理は一意のmd5を持つすべての個々のファイルによって異なります、これはこの出力の使用による誤った仮定です。以下は、md5sum ロジックを使用するバックアップスクリプトの例です。私の解決策とは異なり、ロジックはfileAとfileBを正しく識別しますが、joinまだ問題があります。

echo "hello world" > fileA
cp fileA fileB
./backup_script.sh
cp fileA fileC
./backup_script.sh

これを行うにはfileCのバックアップが必要ですか?

答え3

次のコマンドが機能するはずです。

awk '
  NR==FNR {
    a[$1]=$0;
    next
  }
  { if ( a[$1] ) delete a[$1] } 
  END { 
    for ( md5 in a ) { 
      if ( a[md5] ) { print a[md5] } 
    } 
  }
' file1 file2

関連情報