次の3つのファイルセットがあります。
cat "110001_test file_first_file.csv"
ID,NAME,LOCATION
1,Vikrant,Gurgaon
2,Bharat,Noida
3,Raju,Hyderabad
cat "110001_test file_second_file.csv"
ID,NAME,LOCATION
1,Vikrant,Gurgaon
22,abcd,Noida
3,Raju,Hyderabad
cat "110001_test file_third_file.csv"
ID,NAME,LOCATION
1,Vikrant,Gurgaon
2,Bharat,Noida
33,xyz,Hyderabad
以下のコマンドを使用してこれらのファイルをマージし、ヘッダーを一番上に保持し、重複したエントリがある場合は削除しました。
find . -type f -name '*test file*.csv' -exec cat {} + | awk 'NR == 1; NR > 1 {print $0 | "sort -u"}' > output.file
私に提供される結果は次のとおりです。
ID,NAME,LOCATION
1,Vikrant,Gurgaon
22,abcd,Noida
2,Bharat,Noida
33,xyz,Hyderabad
3,Raju,Hyderabad
ID,NAME,LOCATION
私はここで何が起こっていて、コマンドが何をしているのか理解しています。デフォルトでは、最初の行を無視して別のレコードを選択して、その中の重複する項目を並べ替えて削除します。したがって、出力ファイルの下部に追加のヘッダーが表示されます。
このような出力を期待しています。
ID,NAME,LOCATION
1,Vikrant,Gurgaon
22,abcd,Noida
2,Bharat,Noida
33,xyz,Hyderabad
3,Raju,Hyderabad
ベストアンサー1
使用とbash
:head
tail
sort
ファイル名を配列として保存してから
- 最初のファイルのヘッダー行を印刷します。
- 2行目から、すべてのファイルの内容と
sort
固有のオプションを使用して結果を出力します。 - 出力をファイルにリダイレクトする
files=( *test*.csv )
{
head -n1 "${files[0]}"
for i in "${files[@]}"; do
tail -n+2 "$i"
done | sort -u
} > output