Linux
從多個 csv 文件複製特定列並將其寫入新的 csv 文件。外殼腳本
我有多個 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 . . . .
以下假設
- CSV 數據是“簡單的”,這意味著它的欄位不包含嵌入的逗號或換行符。
- 所有文件都具有相同的行數。
- 目前目錄包含至少一個 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