
我有一個以下格式的清單:
group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5
從上面的列表中,我需要透過以下方式產生一個列表:
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
答案1
這是非常如同對數組使用 AWK以及其他一些問題。主要想法是在第一個欄位前面的單獨行上列印從第二個欄位開始的每個欄位。
在本例中,我們指定欄位分隔符號為或,
,;
我們還確保不列印空白欄位(給定資料中第一行的末尾有一個空白欄位)。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
將群組名稱新增至目前輸入行上的每個訪客前面。