(G)AWKを使って名前をIDに変更します。

(G)AWKを使って名前をIDに変更します。

名前をID番号に置き換えて、複数の関連ファイルを匿名化したいと思います。

入力例

ファイル1:

2 simon
4 wesley
5 nikesh
8 sarah
1 jenny

ファイル2:

3 casey
8 jenny
1 alan
1 jessie
5 gordon
9 bill
1 sue

ファイル3

4 jack
2 jenny
6 wesley
8 sarah
6 gordon
1 derek
6 sue
1 jessie
2 pritesh
7 bill

希望の出力

ファイル1

2 user1
4 user2
5 user3
8 user4
1 user5

ファイル2:

3 user6
8 user5
1 user7
1 user8
5 user9
9 user10
1 user11

ファイル3

4 user12
2 user5
6 user2
8 user4
6 user9
1 user13
6 user11
1 user8
2 user14
7 user10

私が試したこと

解決策に配列が含まれていることを願っていますが、この問題で問題が発生しています。

答え1

次のようなことができます

awk '!($2 in a){a[$2] = "user"(++n)} {$2 = a[$2]; print > (FILENAME".anon")}' file1 file2 file3
  • keyが$2arrayにない場合はa追加され、valueはuser文字列とプレフィックス増加変数の連結です。++n

  • 値を$2配列の対応する値に変更aし、現在のファイル名とサフィックスを関連付けた名前の新しいファイルに結果を印刷します。

答え2

本質的にスチールドライバーの回答、単一awkコードブロック(実際には単一printステートメント)に再編成されます。

awk '{ print $1, ($2 in m) ? m[$2] : m[$2] = "user" ++n >(FILENAME ".anon") }' file[123]

このコードは、割り当て結果が割り当てられる値であるという事実を利用します。

連想配列には、m名前と匿名文字列の間のマッピングが含まれますuser。入力ファイルから読み取られた2つのフィールドの各レコードについて、最初の出力フィールドはそのまま再現され、2番目のフィールドは配列のキーとして使用される2番目の入力フィールドに関連付けられた値から選択されますm。に対応するキーがない場合は、m新しい文字列が生成されて保存されます。userm

Steeldriverが決定したように、生成されたレコードを入力ファイルと同じ名前の新しいファイルに書き込み、ファイル名の.anonサフィックスを追加しました。

文字列にゼロで埋められた数値を使用するには、をに置き換えると、指定されたデータを含むuser文字m[$2] = "user" ++n列がm[$2] = sprintf("user%.3d", ++n)提供されますuser001user014

関連情報