根據第一列從現有列表產生新列表

根據第一列從現有列表產生新列表

我有一個以下格式的清單:

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將群組名稱新增至目前輸入行上的每個訪客前面。

相關內容