ファイルからユーザー名を削除し、増分数字で置き換えます。

ファイルからユーザー名を削除し、増分数字で置き換えます。

テキスト処理の問題です。 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すべて歓迎します。grepbash

答え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

答え2

別の奇妙な

awk '!($5 in a){a[$5]=++i}{sub("[^@]*","USER"a[$5],$5)}1' infile

答え3

Bashを使用すると、次のことができます。

n=0
declare -A users=()
while IFS= read -r line; do
    if [[ $line =~ ([^[:blank:]]+)@ ]]; then
        user=${BASH_REMATCH[1]}
        if [[ -z ${users[$user]} ]]; then
            users[$user]=USER$((++n))
        fi
        line=${line/$user/${users[$user]}}
    fi 
    echo "$line"
done < File2

またはPerlの1行のコード

perl -pe 's/(\S+)(?=@)/ $users{$1} ||= "USER".++$n /e' File2

答え4

を使用すると、sed次のことができます。

$ sed "$(sed '=' File1 | sed -r 'N;s/(.*)\n(.*)/s%\2@hostname%USER\1@hostname%/')" File2
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
$ 

これには3つのコマンドがありますsedsedコマンド 2 と 3 は File1 で sed 式を生成し、Command 1 で File2 を処理するために使用されます。

  • コマンド2は、File1の各行の後に行番号を追加します。
  • コマンド3は、File1の各行とそれに続く行番号を式で並べ替えて、File1のすべてのユーザーなどをsed置き換えますjoeblogs@hostnameUSER1@hostname
  • その後、Command1は生成されたsed式を使用してFile2のすべての代替エントリを処理します。

関連情報