ファイルチェック - 1行ずつの基準の一致

ファイルチェック - 1行ずつの基準の一致

一部のユーザーを一覧表示するファイルがあります。つまり、alluser.list次のようになります。

 user1
 user4
 user2
 user4
 user5
 user3
 user2

次の名前を持つ別のものがありますuserbanned.list

 user5
 user4
 user2

alluser.listこれでファイルを処理して比較してuserbanned.list一致する場合は、行の最後にTrue / Falseなどのフラグを追加する簡単な方法を探しています。

結果は次のようになります。

 user1 FALSE
 user4 TRUE
 user2 TRUE
 user4 TRUE
 user5 TRUE
 user3 FALSE
 user2 TRUE

答え1

使用awk;

$ awk 'NR==FNR{ seen[$0]++;next } 
    { print $0 (($0 in seen)?" TRUE":" FALSE")}' userbanned.list alluser.list
user1 FALSE
user4 TRUE
user2 TRUE
user4 TRUE
user5 TRUE
user3 FALSE
user2 TRUE

awk分解:

NR==FNR - 最初のファイル「userbanned.list」に対してのみ、次のブロックを実行します。

see[$0]++ - キー '$0' (全体行) を使用して連想配列を生成します。
             ファイル "userbanned.list"

Next - 「userbanned.list」ファイルの次の行を読み続けます。

print $ 0 - "alluser.list"ファイルの完全な行を印刷します。 FNR は 1 にリセットされます。
             awkは次のファイルを読みますが、NRは最後のファイルまで増え続けるので、
             最後に読み取ったファイルの行です。

(($0 参照)?" TRUE":" FALSE")
           - これを三項演算子'(条件)?"If-True":"If-False"'といいます。それ
             if/else/ の略で、"alluser.list" ファイルの現在の行があることを確認します。
             配列に存在する場合は「TRUE」を印刷し、それ以外の場合は「FALSE」を印刷します。

また、重複したユーザーがいて、そのユーザーが複数回印刷されることを確認しました。両方のファイルの行を一意に指定し、awk次のように渡すことができます。

$ awk 'NR==FNR{ seen[$0]++;next } { print $0 (($0 in seen)?" TRUE":" FALSE")}
    ' <(sort -u userbanned.list) <(sort -u alluser.list)
user1 FALSE
user2 TRUE
user3 FALSE
user4 TRUE
user5 TRUE

関連情報