次の形式のリストがあります。
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
現在の行の各訪問者の前にグループ名を追加します。