web-dev-qa-db-ja.com

csvファイルに行を挿入する

巨大なcsvファイルがあります(テラバイトのオーダー)。

さて、ヘッダーになっている行を一番上に挿入したいと思います。

たとえば、input.csvが次のようになっているとします。

 1,2,3,4
 22,3,23,1

こんな感じにしたい

id1,id2,id3,id4
 1,2,3,4
 and so on

シェル、ターミナル、awk、bashからこれを行うにはどうすればよいですか?

19
Mohit

その場で、sedを使用します。

sed -i 1i"id1,id2,id3,id4" file.csv

編集:

@Ed Mortonが指摘しているように、sedを-iスイッチと一緒に使用すると、sedはファイルを適切に編集するため、大きなファイルを編集するときに危険な場合があります。 -iオプションの後にプレフィックスを指定すると、sedはバックアップを作成します。したがって、このようなものはより安全です:

sed -i.bak 1i"id1,id2,id3,id4" file.csv

元のファイルはfile.csv.bakに配置されます

25
Lee Netherton

これはとても簡単です:

{ echo "id1,id2,id3,id4"; cat file.csv; } > newfile.csv

単純なシェル連結を使用します。

[〜#〜]編集[〜#〜]

以下のディスカッションスレッドの後、私はこれを提案します:

  • ヘッダー付きのファイルを作成すると、head.txt

次に:

cat head.txt file.csv > newfile.csv
14
Gilles Quenot

編集この回答を書いたとき、質問の「テラバイト」の部分を見落としました。したがって、ここに示す方法は使用しないでください。この素晴らしいツールである標準テキストエディタedの使用を宣伝しているので、私はまだこの投稿を残しています。

通常どおり、edは標準のテキストエディターです。 sed -iを使用するソリューションは、言及されているように、「ファイルをその場で編集」しません。代わりに、コンテンツを一時ファイルに出力し、このファイルの名前を元のファイルに変更します。大きなファイルの場合、これは本当に良くありません。

代わりにedを使用すると、実際にファイルが編集されます。次の行に沿って何か:

#!/bin/bash

file="input.csv"

{
ed -s "$file" <<EOF
1
i
id1,id2,id3,id4
.
wq
EOF
} > /dev/null

説明:1は最初の行に移動し、iは挿入モードに入り、次にid1,id2,id3,id4、次に.を挿入して通常モードに戻り、wq書き込み、終了します。

この方法では、実際にファイルを編集しているため、sedメソッドより2倍高速です。また、edは「大きなファイルでも安全」であることが知られています!

できました。

2
gniourf_gniourf

簡単な方法はありません。ファイルを書き直す必要があります。おそらく最も安全な方法は

 ( echo "id1,id2,id3,id4" ; cat file ) > newFile && rm file

IHTH

1
shellter