Linux

從多個 csv 文件複製特定列並將其寫入新的 csv 文件。外殼腳本

  • April 22, 2022

我有多個 CSV 文件,我想提取第三列並將其寫入新文件,以同樣的方式,文件在文件夾中排序。追加的方式應該是所有的列並排排列,而不是一個在另一個下面。我使用了多個命令

paste -d "," *csv >> Main.csv

導致數據附加的順序不正確。文件排序錯誤。(無法理解如何僅附加特定列,整個文件被附加但並排)

cut -d ',' -f1-2 *.csv t.csv

導致在另一個下方而不是並排附加數據。(並附加了兩列,我可以更改為附加一列)。

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 數據是“簡單的”,這意味著它的欄位不包含嵌入的逗號或換行符。
  2. 所有文件都具有相同的行數。
  3. 目前目錄包含至少一個 CSV 文件。

讓我們從獲取文件列表開始:

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

這將創建一個名為的數組,filelist其中包含目前目錄中與模式匹配的所有文件的名稱*.csv。我首先刪除out.csv,因為我們將使用該名稱作為結果文件,並且如果它存在,我們不想將其包含在處理中。

然後我們從這些文件的第一個中提取第一列。我們將該列保存到一個名為out.csv.

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

然後我們遍歷文件,取出每個文件的第 3 列,並out.csv通過cutpaste和一個名為 的中間文件將其添加到現有文件中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

引用自:https://unix.stackexchange.com/questions/699879