2番目の列を分離するawkコマンド

2番目の列を分離する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コマンドを使用してこれを達成できるかどうかを知りたいです。なぜなら、入力ファイルサイズが大きくなると問題になるからです。

答え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

答え2

アッ解決策:

awk -F'|' 'NF>1 && $2~/[^,]+,[^,]*/{ 
           len=split($2,a,","); 
           for(i=1;i<=len;i++) { 
               if(a[i]!="") print $1,a[i] 
           } 
           next }1' OFS='|' file

出力:

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

詳細:

  • -F'|'- フィールド区切り記号

  • NF>1 && $2~/[^,]+,[^,]*/- 2番目のフィールド内の値がカンマで区切られたフィールドを2つ以上考慮します。

  • len=split($2,a,",")a- 2番目のフィールドを区切り文字で配列に分割します,。変数lenは配列サイズ(ブロック数)で割り当てられます。

  • for(i=1;i<=len;i++) 「を通して繰り返し彫刻

  • if(a[i]!="") print $1,a[i]- null 値を除くすべての関連シーケンスを印刷します。

答え3

その他のawkバージョン

  • |フィールド区切り記号をまたはに設定,
  • レコードにフィールドが 2 つ未満の場合は、そのまま印刷します。
  • elseはすべてのフィールド2を繰り返しNF-1印刷します$1(これは末尾のカンマによる$inullをスキップします)。$NF

つまり

$ awk 'NF<2 ; {for (i=2;i<NF;i++) print $1,$i}' FS='[|,]' OFS='|' file
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

関連情報