Linux
如何遍歷目錄中的所有 csv 文件,選擇一系列列並合併為單個 csv?
我在特定目錄中有大量 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)
或者(假設 GNU
xargs
或兼容):( 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 )
在任何情況下,請注意使用
tail
和cut
類似假設 csv 單元格不包含,
或換行符。為了能夠處理具有任意內容的 csv,您需要使用適當的 csv 操作實用程序,例如mlr
orcsvtool
或適當的程式語言,例如perl
orpython
及其 csv 模組。