タブ区切りファイルの列に基づいて新しい行を追加する

タブ区切りファイルの列に基づいて新しい行を追加する

次のようにタブ区切りのファイルがあります。

211845  032
215979  002   071
217783  143   156   169
219750  111

タブで区切られた複数の項目がある行の場合は、最初の列の値に基づいて新しい行を追加したいと思います。これが私が望む結果です:

211845  032
215979  002
215979  071
217783  143
217783  156
217783  169
219750  111

どんなアイデアでもありがとうございます。このアイデアのためパニックになりました。

答え1

、を使用してawk各行の最初のフィールドの後にあるフィールドを繰り返し、各フィールドに対して新しい行を印刷します。

awk -F'\t' -v OFS='\t' '{for (i=2;i<=NF;i++) print $1,$i}' file

出力:

211845  032
215979  002
215979  071
217783  143
217783  156
217783  169
219750  111

これにより、空の行またはフィールドが1つしかない行を削除できます。これはおそらく欲しいものです。現在の状態に保つには、次のように変更します。

awk -F'\t' -v OFS='\t' 'NF<2 {print; next} {for (i=2;i<=NF;i++) print $1,$i}' file

答え2

GNU sed-E読みやすい正規表現を作成するのに役立つ拡張正規表現モードを使用すると、これを行うことができます。

sed -E '
  s/\t/\n/2;T
  s/^([^\t]+\t).*\n/&\1/
  P;D
' file

出力:

211845  032
215979  002
215979  071
217783  143
217783  156
217783  169
219750  111

  • 行にタブ文字が2文字未満の場合は、Tコマンドを使用してそのまま表示します。
  • P コマンドを使用して最初のペアを表示し、最初のペアの後に最初のフィールドをリンクします。
  • このプロセスはタブが残るまで続行され、その後、最初のステップで印刷されます。

関連情報