その後、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の答えと比較すると、非常に長いファイルでもうまく機能します。 (彼は最初にファイルをメモリにロードしてからエコーを実行し、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その場所で編集されるため、ファイル全体がコピーされるのを待ったりメモリに保存したりする必要はありません。

関連情報