テキスト処理の問題です。 2つのファイルがあります。
joeblogs
johnsmith
chriscomp
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" johnsmith@hostname
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" chriscomp@hostname
ファイル1には、ログ(ファイル2)に表示される一意のユーザー名のリストが含まれています。
希望の出力
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname
これら2つのファイルは必要ないと思います。ファイル1は、ファイル2の一意のユーザー名を解析することによって生成されます。私のロジックは、私が知っているユーザー名のリストをファイル2に表示し、それを繰り返しますsed
。
それは次のとおりです。
for i in $(cat file1);do sed -e 's/$i/USER[X]';done
USER[X]
各固有のユーザー名に応じて増加します。
しかし、私はこれを行うことはできません。私はその論理が健全だとは思わない。必要な結果を得るのに役立ちますか?awk
///sed
すべて歓迎します。grep
bash
ベストアンサー1
気づいた時「これら2つのファイルは必要ありません。」、以下を使用してくださいawk
初期処理ソリューション丸太ワンタイムアーカイブ:
awk '{
u_name = substr($5, 1, index($5, "@"));
if (!(u_name in users)) users[u_name] = ++c;
sub(/^[^@]+/, "USER" users[u_name], $5)
}1' file.log
出力:
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname