Shell-Script

用於分隔第二列的 awk 命令

  • June 20, 2017

我有一個包含以下格式數據的文件

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

引用自:https://unix.stackexchange.com/questions/372253