データ行の前にヘッダー行を追加して、テキストファイルを並べ替えます。

データ行の前にヘッダー行を追加して、テキストファイルを並べ替えます。

内容は次のようなファイルがあります。

2009 150  0  0  0     0000
75.316   0.0400390625  0.00007        0.00000 0.8980
76.216   0.0400390625  0.00007        1.00000 0.9046
77.217   0.0400390625  0.00009        2.00000 0.9113
78.341   0.0400390625  0.00010        3.00000 0.9183
2009 150  2  0  0     0000
75.316   0.0400390625  0.00007        0.00000 0.8980
76.216   0.0400390625  0.00007        1.00000 0.9046
77.217   0.0400390625  0.00009        2.00000 0.9113
78.341   0.0400390625  0.00010        3.00000 0.9183
79.616   0.0400390625  0.00013        4.00000 0.9255

私の考えでは:

  1. キーワード2009で始まるすべての行を見つけます。
  2. この行は、2009で始まる他の行が見つかるまで、すべての後続の行の前に追加され、EOFまで続きます。

本質的に、次のような出力を探しています。

2009 150  0  0  0     0000 75.316   0.0400390625  0.00007        0.00000 0.8980
2009 150  0  0  0     0000 76.216   0.0400390625  0.00007        1.00000 0.9046
2009 150  0  0  0     0000 77.217   0.0400390625  0.00009        2.00000 0.9113
2009 150  0  0  0     0000 78.341   0.0400390625  0.00010        3.00000 0.9183
2009 150  2  0  0     0000 75.316   0.0400390625  0.00007        0.00000 0.8980
2009 150  2  0  0     0000 76.216   0.0400390625  0.00007        1.00000 0.9046

.........

私は長い間この問題に悩んできましたが、解決策が見つかりませんでした。どんな助けでも大変感謝します。フラグを使用してキーワード間のテキストを抽出する方法を知っていますが、これが正しい方向であるかどうかはわかりません。

答え1

次の目的で使用できますawk

awk '/^2009/{a=$0;next}{print a" "$0} ' file.txt

これにより、2009が最初に表示される前に行の前にスペースが追加されます。次のようにデフォルトの文字列をプレフィックスに設定できます。

awk 'BEGIN{a="My default prepend string";}/^2009/{a=$0;next}{print a" "$0} ' file.txt

答え2

私はPerlでこれをします:

perl -lne 'if(/^2009/){$n=$_; next} print "$n $_"' file

それとももっと簡単に

perl -lne '/^2009/ ? ($n=$_) : print "$n $_"' file

アイデアは、現在の行(Perl)で始まる$_ように保存し、そうでない場合は現在の行との現在の値を印刷することです。$n2009$n

答え3

使用sed:

sed -n '
  /^2009/ { h }
  /^2009/ !{ G; s/^\(.*\)\n\(.*\)$/\2 \1/p }
  ' in_file

要求どおりに説明してください。

-nsed- 私たちが指示しない限り、何も印刷されません。

/^2009/ { h }- で始まる行に達したら、2009それを保持バッファに入れます。

/^2009/ !{...}- で始まらないすべての行にパターンが{...}適用されます2009

G; s/^\(.*\)\n\(.*\)$/\2 \1/p- 保持バッファをコピーして、パターンG空間に読み込んだ行に追加します。これでパターンスペースに2つの行があるので、印刷する前に順序を変更して結合する必要があります。逆参照を使った代替パターンがまさにそのようなことをします。

関連情報