Shell-Script
用於分隔第二列的 awk 命令
我有一個包含以下格式數據的文件
Item1|keys,books,helmet,handle, Item2|Bike, Item3 Item4|Tyre,brakes,headlight,clamps,rollergrip, Item5|Nails,hammers,
我希望將上述數據轉換為以下格式
Item1|keys Item1|books Item1|helmet Item1|handle Item2|Bike Item3 Item4|Tyre Item4|brakes Item4|headlight Item4|clamps Item4|rollergrip Item5|Nails Item5|hammers
我試圖通過使用 cut 命令來實現這一點,儘管它工作正常我想知道這可以使用 awk 命令來實現。因為如果輸入文件大小變大,那麼它應該很麻煩。
sed -e 's/,$//' -e '/^[^|]*$/s/$/|/' file.in | awk -F'[|,]' -vOFS='|' '{ for (i = 2; i <= NF; ++i) { print $1, $i } }'
對
sed
輸入數據進行一些預處理。它刪除每行末尾的尾隨逗號 (-e 's/,$//'
),如果一行不包含管道符號,它會在末尾添加一個 (-e '/^[^|]*$/s/$/|/'
)。
sed
範例數據通過過濾器轉換為以下內容:Item1|keys,books,helmet,handle Item2|Bike Item3| Item4|Tyre,brakes,headlight,clamps,rollergrip Item5|Nails,hammers
腳本接受這個
awk
並將每一行解釋為一組由管道符號或逗號 (-F'[|,]'
) 分隔的欄位。對於每個輸入行,它將重複地將第一個欄位與其他每個欄位配對並輸出它們。輸出中的每對欄位由管道符號 (-vOFS='|'
) 分隔。結果是
Item1|keys Item1|books Item1|helmet Item1|handle Item2|Bike Item3| Item4|Tyre Item4|brakes Item4|headlight Item4|clamps Item4|rollergrip Item5|Nails Item5|hammers