複数のCSVファイルがあり、フォルダ内のファイルがソートされるのと同じ方法で3番目の列を抽出して新しいファイルに書きたいと思います。追加は、ある列が別の列の下にあるのではなく、すべての列が並んで配置されるように実行する必要があります。複数のコマンドを使用しました
paste -d "," *csv >> Main.csv
これにより、データが誤った順序で追加されます。ファイルが正しくソートされていません。 (特定の列だけを追加する方法を理解できません。ファイル全体が並べて追加されますが)
cut -d ',' -f1-2 *.csv t.csv
データが並んでいるのではなく、他のものの下に1つずつ追加されます。 (そして2つの列を追加すると、1つの列を追加するように変更できます)。
cut -d ',' -f1-2 File1.csv | paste File2.csv - > Main.csv
この方法は2つのファイルに対して機能しますが、複数のファイルを読むにはどのように拡張できますか?
Eg:-
File_1.csv
a,32,37
b,26,34
c,56,65
File_2.csv
a,92,60
b,48,63
c,52,23
File_3.csv
a,2,37
b,45,53
c,56,63
.
.
.
.
Output_File.csv
a,37,60,37 . . . .
b,34,63,53 . . . .
c,65,23,63 . . . .
答え1
次の仮定
- CSVデータは「単純」です。つまり、そのフィールドにコンマや改行が含まれていません。
- すべてのファイルの行数は同じです。
- 現在、ディレクトリには1つ以上のCSVファイルが含まれています。
まず、ファイルのリストをインポートします。
rm -f out.csv
filelist=( *.csv )
filelist
これにより、このパターンに一致する現在のディレクトリのすべてのファイル名を含む配列が作成されます*.csv
。out.csv
結果ファイルにその名前を使用し、その名前が存在する場合は処理に含めたくないため、最初に削除しました。
次に、最初のファイルから最初の列を抽出します。熱をout.csv
。
cut -d , -f 1 -- "${filelist[0]}" >out.csv
次に、ファイルを繰り返しながら各ファイルの3番目の列を取得し、という中間ファイルを介してout.csv
既存のファイルに追加します。cut
paste
out.tmp
for file in "${filelist[@]}"; do
cut -d , -f 3 -- "$file" | paste -d , out.csv - >out.tmp &&
mv out.tmp out.csv
done
すべてが/bin/sh
(配列なしで)次のように書き直されました。
rm -f out.csv
set -- *.csv
cut -d , -f 1 -- "$1" >out.csv
for file do
cut -d , -f 3 -- "$file" | paste -d , out.csv - >out.tmp &&
mv out.tmp out.csv
done
答え2
使いやすいコードは次のとおりです。
paste -d"," *csv>>OG.csv
cut --complement -d',' -f3,4,5,7,8,10,.. OG.csv>>Data.csv
代替案があれば時間を教えてください。