
次の形式のリストがあります:
group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5
上記のリストから、次の方法でリストを生成する必要があります。
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
答え1
これはとてもに似ている配列にAWKを使用する他にもいくつか質問があります。主なアイデアは、最初のフィールドの後に、フィールド 2 以降の各フィールドを別の行に印刷することです。
この場合、フィールド区切り文字が または であることを指定し,
、;
空のフィールドを出力しないようにします (指定されたデータの最初の行の末尾に空のフィールドがあります)。OFS
コマンド ラインで設定する変数は、-v
出力フィールドを区切るために使用される出力区切り文字列であり、NF
は行のフィールド数です。
awk -F '[,;]' -v OFS=',' '{ for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
質問のデータから、これは
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
答え2
これは、GNU sed を使用して次のように実行できます。
sed -r 's:,$::;y:;,:,;:;:l;s:^(([^,]+)[^;]+);:\1\n\2,:;tl' file
各入力行の末尾のカンマを削除し、印刷しやすいようにカンマをセミコロンに置き換えます。その後、 と の間で検索と置換のループを実行して、:l
現在tl
の入力行の各訪問者の先頭にグループ名を追加します。