Linux

如何遍歷目錄中的所有 csv 文件,選擇一系列列並合併為單個 csv?

  • October 21, 2021

我在特定目錄中有大量 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

沒有任何運氣。

任何意見是極大的讚賞。謝謝你。

與其嘗試覆蓋每個文件並稍後連接,不如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
)

在任何情況下,請注意使用tailcut類似假設 csv 單元格不包含,或換行符。為了能夠處理具有任意內容的 csv,您需要使用適當的 csv 操作實用程序,例如mlrorcsvtool或適當的程式語言,例如perlorpython及其 csv 模組。

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