最初の列に基づいて既存のリストから新しいリストを生成する

最初の列に基づいて既存のリストから新しいリストを生成する

次の形式のリストがあります:

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の入力行の各訪問者の先頭にグループ名を追加します。

関連情報