awkで新しい行を印刷する方法

awkで新しい行を印刷する方法

各データセットが改行(\ 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

または

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

または

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

この回答 各フィールドの最大データ長を決定する方法を示します。

関連情報