次の形式のデータを含むファイルがあります。
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コマンドを使用してこれを達成できるかどうかを知りたいです。なぜなら、入力ファイルサイズが大きくなると問題になるからです。
ベストアンサー1
sed -e 's/,$//' -e '/^[^|]*$/s/$/|/' file.in |
awk -F'[|,]' -vOFS='|' '{ for (i = 2; i <= NF; ++i) { print $1, $i } }'
入力データに対してsed
いくつかの前処理を行います。-e 's/,$//'
各行の末尾にあるカンマ()を削除し、行に-e '/^[^|]*$/s/$/|/'
パイプ記号がない場合は、最後に1()を追加します。
サンプルデータはフィルタによって次のように変換されます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