次のようにタブ区切りのファイルがあります。
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 コマンドを使用して最初のペアを表示し、最初のペアの後に最初のフィールドをリンクします。
- このプロセスはタブが残るまで続行され、その後、最初のステップで印刷されます。