特定のディレクトリに多数の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
)
いずれにしてもtail
、cut
同様のエントリを使用すると、csvセルに改行文字,
や改行文字が含まれていないと仮定します。任意のコンテンツを含むCSVを処理するには、mlr
ORなどの適切なCSV操作ユーティリティ、またはORおよび対応するcsvモジュールなどのcsvtool
適切なプログラミング言語を使用する必要があります。perl
python