一部のユーザーを一覧表示するファイルがあります。つまり、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