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