内容は次のようなファイルがあります。
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
私の考えでは:
- キーワード2009で始まるすべての行を見つけます。
- この行は、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)で始まる$_
ように保存し、そうでない場合は現在の行との現在の値を印刷することです。$n
2009
$n
答え3
使用sed
:
sed -n '
/^2009/ { h }
/^2009/ !{ G; s/^\(.*\)\n\(.*\)$/\2 \1/p }
' in_file
要求どおりに説明してください。
-n
sed
- 私たちが指示しない限り、何も印刷されません。
/^2009/ { h }
- で始まる行に達したら、2009
それを保持バッファに入れます。
/^2009/ !{...}
- で始まらないすべての行にパターンが{...}
適用されます2009
。
G; s/^\(.*\)\n\(.*\)$/\2 \1/p
- 保持バッファをコピーして、パターンG
空間に読み込んだ行に追加します。これでパターンスペースに2つの行があるので、印刷する前に順序を変更して結合する必要があります。逆参照を使った代替パターンがまさにそのようなことをします。