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
という名前のファイルに必要なヘッダーがある場合は、次のようにしてヘッダーを挿入できます。header
printf "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
、その場で編集されるため、ファイル全体がコピーされるのを待ったり、メモリ内に保持したりする必要がありません。