最初の3つの共通列に基づいてレコードをマージし、最後の列に珍しい値をカンマで区切って配置する必要があります。私は以下を行う必要があります -
入力ファイル:
HWF CommonDomain javatools AdminServer
ABC CommonDomain resourcebundle AdminServer
HWF CommonDomain stringeditor AdminServer
ABC CommonDomain resourcebundle HelpPortalServer_1
HWF CommonDomain stringeditor HelpPortalServer_1
HWF CommonDomain javatools HelpPortalServer_1
予想出力:
ABC CommonDomain resourcebundle AdminServer,HelpPortalServer_1
HWF CommonDomain javatools AdminServer,IHelpPortalServer_1
HWF CommonDomain stringeditor AdminServer,HelpPortalServer_1
答え1
質問を更新していただきありがとうございます。 100%改善されました。
いわゆる「非一般的な」値に含まれる値を出力で繰り返す必要があるかどうかについて言及していませんでしたが、私の考えではそうではありません。
このスクリプトはすべてのバージョンで動作する必要がありますawk
。 GNU 拡張はありません。テストのためのgawk --traditional
より多くの条件をテストするために追加の入力データを追加しました。これは入力の重複レコードを処理します。私が予想する最大の問題は入力のカンマです。スクリプトは指定されたとおりに機能しますが、出力ファイルには空のフィールドがあるように見えます。
コードの説明:
配列recs
は最初の3つのフィールドを連結することによってインデックス付けされます。 (配列はawk
文字列でインデックス付けされています。)配列の各要素には、カンマで区切られた「一般的ではない」フィールドが含まれています。
各入力行について:key
最初の3つのフィールドを含みます。ループはfor
残りのフィールドを段階的に進めます。このif
ステートメントは、そのキーのフィールドがすでに保存されていないことを確認します。そうでない場合、そのフィールドはレコードの最後に追加され、適切にスペースまたはカンマが先頭に追加されます。
入力の終わり(END
ラベル):キーを介してrecs配列に移動し、キーとキーに含まれるデータを印刷します。
#!/bin/sh
awk '
{
key = $1 " " $2 " " $3;
for (i = 4; i <= NF; i++) {
if (recs[key] !~ "(^|,)"$i"(,|$)") {
recs[key] = recs[key] (recs[key] ? "," : "") $i
}
}
}
END {
for (key in recs) {
print key " " recs[key]
}
}
' <<EOF
HWF CommonDomain javatools AdminServer
HWF CommonDomain javatools AdminServer2
HWF CommonDomain javatools 3AdminServer
HWF CommonDomain javatools AdminServer
HWF CommonDomain javatools AdminServer
ABC CommonDomain resourcebundle AdminServer
ABC CommonDomain resourcebundle AdminServer
ABC CommonDomain resourcebundle AdminServer2
ABC CommonDomain resourcebundle 3AdminServer
HWF CommonDomain stringeditor AdminServer2
HWF CommonDomain stringeditor 3AdminServer
ABC CommonDomain resourcebundle HelpPortalServer
HWF CommonDomain stringeditor HelpPortalServer_1
HWF CommonDomain javatools HelpPortalServer_1
HWF CommonDomain javatools HelpPortalServer_2
HWF CommonDomain javatools 3_HelpPortalServer_2
HWF CommonDomain stringeditor HelpPortalServer
HWF CommonDomain javatools HelpPortalServer_1
HWF CommonDomain javatools HelpPortalServer_2
HWF CommonDomain javatools 3_HelpPortalServer
EOF
出力:
HWF CommonDomain stringeditor AdminServer,HelpPortalServer_1
HWF CommonDomain javatools AdminServer,AdminServer2,3AdminServer,HelpPortalServer_1,HelpPortalServer_2,3_HelpPortalServer_2
ABC CommonDomain resourcebundle AdminServer,HelpPortalServer_1