ヘッダーをマージせずに複数のCSVファイルをマージする


20

catコマンドを使用して)複数の.CSVファイルをマージする必要がありますが、各ファイルのヘッダーはコピーしません。

このタスクを達成する最良の方法は何ですか?

回答:


32

ここでcat説明するように、コマンド以上のものが必要です

:あなたは3 CSV-ファイルを持っていると言うfile1.csvfile2.csvと、file3.csvとにそれらに参加したいbigfile.csvの使用、その後、最初の行(のみ)と、あなたのヘッダが常にあります

どちらか(最初のファイル「file1.csv」からヘッダーを保持):

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

または(「file」で始まる名前のすべてのファイルからヘッダーを削除します):

awk 'FNR > 1' file*.csv > bigfile.csv

4
私はこれを一般的なLinuxの答えを探して見つけましたが、私の場合、これは正確に機能しませんでした。静かにfile1.csvを無視します。そのファイルをcatする必要がありました。 cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
レロン

私は尾+ 2取得しています:私は猫を使用する場合、コマンドが見つからない<file1.csv <(尾2 file2.csv)<(尾2 file3.csv)> bigfile.csv方法

@ user64636末尾と+2の間にスペース文字が必要です
nohillside

実際に使用tail -n+2tail +2なければならなかった、うまくいかないだろう
マチューナポリ

11

私は一番上の答えに同意しますが、次のシナリオで拡張することをお勧めします(コメントできないため)。

出力ファイルにヘッダーを含める(1回)場合、正しいスクリプトは次のとおりです。

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNRは、単一ファイル内の処理済みレコードの数を表します。そしてNRはそれをグローバルに表現するため、最初の行が受け入れられ、残りは以前と同様に無視されます。


6

{ ; }プロセス置換(<())の代わりにグループコマンド()を使用することもできます。

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

ファイルが空行(\r\n)で終わる限り、CRLF行の終わりでも機能します。

頭と尾の数字のみのバージョンは、POSIX 1003.1-2001で廃止され、一部の環境では警告が発生します。


2

同じ列を持つ2つの大きなCSVをチャンクスクリプト用の大きなCSVに連結する必要がありました(データには一意のIDはありません)。

最初に2番目のcsvからヘッダーを取り出しました

awk 'FNR > 1' file2.csv > file2_noheading.csv

次に、以下を介して連結

cat file1.csv file2_noheading.csv > newfile.csv

1

上記のコマンドシーケンスを使用すると、次のようなファイルが作成されました。

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

1つのヘッダー行とすべての関連する値を含む適切なCSVにするために、次のsed呪文を採用しました...sed -ie "/^$/d;/^==>/d" bigfile.csv


0

大量のファイルがある場合の簡単なソリューション:

awk 'FNR > 1' *.csv > merged.csv

大きなファイルを編集してヘッダーを追加し直すだけです。


あなたの答えは、2013年にiolsmitによって準備されたものとどのように異なりますawk 'FNR > 1' file*.csv > bigfile.csvか?そうではありません!
user3439894

再:どのように違うのですか?それはより簡潔な答えであり、少なくともコピーして貼り付けたものです:)私の賛成票を取得します
リックデイヴィス

すべてのファイルを開始する必要はないため、これは良い答えですfile
-big_smile
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.