34

同じヘッダーを持つ複数の CSV ファイルをマージする必要があります。最初のファイルのヘッダーを保持し、他のすべてのファイルのヘッダーを削除してマージし、1 つのマスター ファイルを作成する必要があります。

ファイル 1:

Id,city,name ,location
1,NA,JACK,CA

ファイル 2:

ID,city,name,location
2,NY,JERRY,NY

出力:

Id,city,name,location
1,NA,JACK,CA
2,NY,JERRY,NY

現在、私はこのコードを使用しています:

ls *.csv | xargs -n 1 tail -n+2 > master.csv

このコードはファイルを完全にマージしますが、最初のファイルのヘッダーが必要なため、ヘッダーが得られません。

私は何をすべきか?

4

4 に答える 4

77
awk 'FNR==1 && NR!=1{next;}{print}' *.csv

Solaris UNIX でテスト済み:

> cat file1.csv
Id,city,name ,location
1,NA,JACK,CA
>
> cat file2.csv
ID,city,name,location
2,NY,JERRY,NY
>
> nawk 'FNR==1 && NR!=1{next;}{print}' *.csv
Id,city,name ,location
1,NA,JACK,CA
2,NY,JERRY,NY
> 

kevin-dによる説明:

FNR は、現在のファイルでこれまでに読み取られた行 (レコード) の数です。NR は、全体的に読み取られた行数です。したがって、条件 'FNR==1 && NR!=1{next;}' は、「現在のファイルの最初の行であり、少なくとも 1 行が全体的に読み取られている場合は、この行をスキップする」ことを示しています。これには、最初のファイルの CSV ヘッダーを出力し、残りのファイルをスキップするという効果があります。

の違いのリンク

于 2013-06-03T05:52:25.910 に答える
1

Perl がオプションの場合:

perl -ne 'print if $. > 1 or ! $h; $h=1; close ARGV if eof' *.csv > master.csv

$.行番号です。
ファイル間で自動的にリセットされないため、close ARGV if eof必要です。
$hヘッダーがすでに印刷されているかどうかを記録します。

于 2015-11-12T23:54:44.430 に答える
0

このスレッドの受け入れられたソリューションを使用するすべての人への補足として(私も同様です:))-ヘッダーに新しい行が含まれている場合、つまり次のような場合、このコードは失敗することに注意してください

column1,"column\nwith\new line",column2
value1,value2,value3
...

この場合、その部分のみがcolumn1,"columnヘッダーと見なされ、残りのヘッダーは通常の行と見なされます (これにより、最終的な CSV が完全に壊れます)。内部に新しい行があるヘッダーがある場合、私が考えることができる唯一の解決策は、ヘッダーを正しく読み取ることができる「本格的な」csv リーダー ライブラリを使用することです。

しかし、この小さな問題にもかかわらず、上記の行により、多くの頭痛から救われました。:D

于 2020-10-29T19:32:56.037 に答える