各データセットが改行(\ n)でラップされたファイルから収集されたデータを印刷しようとしています。
パスワード:
awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump2.txt
次のように出力します。
mail: [email protected] , fullName: Bogus Bogus, uid: 666 mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667
希望の出力:
mail: [email protected] , fullName: Bogus Bogus, uid: 666 \n
mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667 \n
答え1
努力する
awk '/mail:|fullName:/{s=s", "$0} /uid:/ {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt
フィールドに%がないと仮定
その他のソリューション
awk '/mail:|fullName:/{s=s", "$0} /uid:/ {print substr(s,3) ", "$0 ;s=""} ' dump2.txt
uid:が最後であるとします。
答え2
\n
必要な場所に追加するだけです。
awk '/mail:|fullName:|uid:/{s=s", "$0}\n END{print substr(s,3)}' dump2.txt
答え3
もう1つの秘密:1つの大きな文字列にすべて保存するのではなく、進行中に印刷してください。
awk '$1=="mail:" || $1=="fullName:" {printf "%s, ", $0} $1=="uid:"' dump2.txt
答え4
注:以下の内容はすべて、そのuid:
行が常に各グループの最後の行であると想定しています。ただし、これはすべて%
データの文字に適用されます。
すべてのデータを保存して最後に印刷するには、配列を使用する少し簡単な方法があります。
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count] = s[count] ", " $0} /uid:/ {count++}
END {for (i=0; i<count; i++) print substr(s[i],3)}' dump2.txt
(最後に)フィールドを個別に処理するには、2D配列を使用します。
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%s, %s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
(Glennの答えと同様にmail:
、fullName:
およびuid:
文字列が行の最初のフィールドとして現れると仮定します。)
ソートに言及するときはどういう意味ですか?
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%23s, %23s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
➘
郵便:[Eメール保護]、フルネーム:Bogus Bogus、uid:666 郵便:[Eメール保護]、フルネーム:Bogus2 Bogus2、uid:667または
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%-23s, %-23s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
➘
郵便:[Eメール保護] 、フルネーム:Bogus Bogus、uid:666 郵便:[Eメール保護]、フルネーム:Bogus2 Bogus2、uid:667または
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%-23s %-24s %s\n",
s[i]["mail:"] ",",
s[i]["fullName:"] ",",
s[i]["uid:"]}' dump2.txt
➘
郵便:[Eメール保護]、フルネーム:Bogus Bogus、uid:666 郵便:[Eメール保護]、フルネーム:Bogus2 Bogus2、uid:667
この回答 各フィールドの最大データ長を決定する方法を示します。