複数のcsvファイルの特定の列をコピーして、新しいcsvファイルに書き込みます。シェルスクリプト

複数のcsvファイルの特定の列をコピーして、新しいcsvファイルに書き込みます。シェルスクリプト

複数の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

次の仮定

  1. CSVデータは「単純」です。つまり、そのフィールドにコンマや改行が含まれていません。
  2. すべてのファイルの行数は同じです。
  3. 現在、ディレクトリには1つ以上のCSVファイルが含まれています。

まず、ファイルのリストをインポートします。

rm -f out.csv
filelist=( *.csv )

filelistこれにより、このパターンに一致する現在のディレクトリのすべてのファイル名を含む配列が作成されます*.csvout.csv結果ファイルにその名前を使用し、その名前が存在する場合は処理に含めたくないため、最初に削除しました。

次に、最初のファイルから最初の列を抽出します。熱をout.csv

cut -d , -f 1 -- "${filelist[0]}" >out.csv

次に、ファイルを繰り返しながら各ファイルの3番目の列を取得し、という中間ファイルを介してout.csv既存のファイルに追加します。cutpasteout.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

代替案があれば時間を教えてください。

関連情報