awk コマンドの出力に後でヘッダーを追加するにはどうすればよいでしょうか?

awk コマンドの出力に後でヘッダーを追加するにはどうすればよいでしょうか?

awk を使用して別のファイル (入力) からファイル (出力) を作成します (ヘッダーをスキップ)。

awk 'NR==1{next} $3==1 {print $1"\t"$2}' input > output

その後でしか計算できないヘッダー情報があり、これを sed を使用して追加します。

sed -i "1s/^/head1\thead2\n/" output

しかし、sed はかなり遅いので、もっと良い方法はないでしょうか? たとえば、awk の結果を保存し、ヘッダー情報を取得してからファイルを書き込むとか?

答え1

ファイルに本文があり、 ( )outputという名前のファイルに必要なヘッダーがある場合は、次のようにしてヘッダーを挿入できます。headerprintf "head1\thead2\n" > header

ed -s output <<< $'0r header\nw\nq'

-s、診断出力 ( から読み込んだバイト数output、 から読み込んだバイト数header、最後に書き込んだバイト数) を抑制するように指示します。

ed コマンドは次のとおりです。

  • 0r header- 0行目でファイルの内容を読み取りますheader
  • w- ファイルを書き出す
  • q- 終了

答え2

試してみるバッシュ:

echo -e "head1\thead2\n$(cat output)" > /tmp/out && mv /tmp/out output

答え3

私はbashでやる

{ echo -e "head1\thead2" ; cat output ; } > newoutput

RomanPerekhrest の回答と比較すると、非常に長いファイルでも適切に動作します (彼の回答では、まずファイルをメモリにロードしてから echo を実行します。また、bash には入力の最大長があると思います)

答え4

さらにグーグルで検索してみると、次の質問が見つかりました。 ファイル全体を書き換えずに巨大なファイルのヘッダーを変更する

ヘッダーを追加するときにファイル全体を書き換える必要がないように、ファイルの作成時に最小バイト数のダミー ヘッダーを (ゼロを埋め込んで) 出力しました。

awk 'NR==1{print "dummyhead100\tdummyhead20000"; next} $3==1 {print 
$1"\t"$2}' input > output

次に、新しいヘッダーを header.tsv としてファイル (または文字列変数) を作成し、ダミー ヘッダーをその場で置き換えます (ダミー ヘッダーと新しいヘッダーのバイト数が同じであることを確認してから) dd

dd conv=notrunc obs=1 if=header.tsv of=output

この方法ではoutput、その場で編集されるため、ファイル全体がコピーされるのを待ったり、メモリ内に保持したりする必要がありません。

関連情報