さまざまなファイルをマージ/ソートし、ヘッダーを一番上に保つ

さまざまなファイルをマージ/ソートし、ヘッダーを一番上に保つ

次の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:headtailsort

ファイル名を配列として保存してから

  • 最初のファイルのヘッダー行を印刷します。
  • 2行目から、すべてのファイルの内容とsort固有のオプションを使用して結果を出力します。
  • 出力をファイルにリダイレクトする
files=( *test*.csv )
{
  head -n1 "${files[0]}"
  for i in "${files[@]}"; do
    tail -n+2 "$i"
  done | sort -u
} > output

おすすめ記事