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

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

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

group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5

上記のリストでは、次のようにリストを作成する必要があります。

group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5

答え1

これは非常に〜のように配列でAWKを使用するそして他の問題。主なアイデアは、2番目のフィールドから始めて、最初のフィールドの前の別々の行に各フィールドを印刷することです。

この場合、フィールド区切り文字を,or と指定;し、空のフィールドが印刷されないことを確認します(与えられたデータの最初の行の末尾に空のフィールドがあります)。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現在の行の各訪問者の前にグループ名を追加します。

関連情報