ディレクトリ内のすべてのcsvファイルを繰り返し、列の範囲を選択し、単一のcsvにマージするにはどうすればよいですか?

ディレクトリ内のすべてのcsvファイルを繰り返し、列の範囲を選択し、単一のcsvにマージするにはどうすればよいですか?

特定のディレクトリに多数のCSVファイルがあります。すべて一致するヘッダーを持つ少なくとも41列がありますが、幅は最大200まで可能です。最初の40列を取得して追加して、ヘッダー付きのCSVを作成します。私はこれに比較的慣れておらず、この例に従おうとしています。bashを使用してディレクトリ内のすべてのcsvファイルの最初の200行を保持する方法は?それと組み合わせる複数の.csvファイルの内容を単一の.csvファイルにマージする。一行に制限しようとするのに可能でしょうか? "cut"と"cat"コマンドの組み合わせが必要になるようです。私は次のことをうまく実行せずに試しました。

$ for file in *.csv do cut -d ',' -f1-40 "$file" > "$file"; done

それから

cat *csv > combined.csv

まったく運がありません。

どんなアドバイスも本当にありがとうございます。ありがとうございます。

ベストアンサー1

すべてのファイルを上書きして後で接続するのではなく、cutすべてのファイルを切り取り、結果を直接出力しますcombined.csv

リスト自体にそのエントリが含まれていないことを確認する必要がありますcombined.csv。そうしないと、ファイルシステムをいっぱいにする無限ループが発生する可能性があります。

(rm -f combined.csv && set ./*.csv && cut -d, -f1-40 "$@" > combined.csv)

または(GNUxargsまたは互換性があると仮定):

(
  rm -f combined.csv &&
    set ./*.csv &&
    printf '%s\0' "$@" |
      xargs -r0 cut -d, -f1-40 > combined.csv
)

ファイルリストがcsv大きすぎる場合「パラメータリストが長すぎます」間違い。

最初のファイルを除くすべてのファイルからヘッダーを削除するにはループが必要ですが、それでも各ファイルを内部で編集して後でリンクするよりも、ループの出力をリダイレクトする方が良いでしょう。

(
  rm -f combined.csv && set ./*.csv &&
  {
    cut -d, -f1-40 < "$1"
    shift
    for file do
      tail -n+2 < "$file" | cut -d, -f1-40
    done
  } > combined.csv
)

いずれにしてもtailcut同様のエントリを使用すると、csvセルに改行文字,や改行文字が含まれていないと仮定します。任意のコンテンツを含むCSVを処理するには、mlrORなどの適切なCSV操作ユーティリティ、またはORおよび対応するcsvモジュールなどのcsvtool適切なプログラミング言語を使用する必要があります。perlpython

おすすめ記事