我正在嘗試使用命令列工具來編輯一些 CSV 檔案,格式如下:
- 資料集
- year_1(即 1929 年)
- csv_filename_1.csv
- csv_filename_2.csv
- csv_filename_3.csv
- ...
- 年_2
- ...
- year_1(即 1929 年)
我正在嘗試將檔案名附加到其內容中,創建一個名為filenamewith./year_1/csv_filename_1.csv到其中的所有列的新列。在那之后,我會gzip它。
由于年份檔案夾的數量(近 100 個)和每個檔案夾中的 CSV 數量(總計 100k ),我計劃使用 gnu 并行運行它,并且
我試圖用 sed 做類似的事情
fname="1929/csv_filename_1.csv" && \ # to simulate parallel's parameterization
sed -E -e '1s/$/,filename/' \ # append ",filename" to CSV header
-e '2,\$s/$/,${fname}/' ${fname} \ # append the filename string to the content
但是我無法讓 sed 使用第二個運算式,因為我要么將“${fname}”按原樣寫入檔案,要么"sed: -e expression #1, char 6: unknown command: '\'"抱怨逗號或斜線的 sed 錯誤。我也曾嘗試將運算式分組,如-e '1{s/$/,filename/};2,\${s/$/,${fname}/}'無濟于事。
目前,我放棄了 sed 并開始嘗試 awk,但不知道為什么它不起作用讓我感到困擾,所以我來詢問為什么以及如何使它起作用。
關于我打算如何運行這件事的更多資訊。它會是這樣的
find ~/dataset -iname "*csv" -print0 | parallel -0 -j0 '<the whole command here (sed gz)>'
我怎么能這樣做?我忘記了什么?謝謝,伙計們!
PS:我剛用 awk 搞定
awk -v d="csv_filename_1.csv" -F"," 'FNR==1{a="filename"} FNR>1{a=d} {print $0","a}' csv_filename_1.csv | less
uj5u.com熱心網友回復:
這可能對您有用(GNU 并行和 sed):
find . -type f -name '*.csv' | parallel sed -i \''1s/$/,filename/;1!s#$#,{}#'\' {}
使用 find 將檔案名傳遞給并行命令。
使用 sed 附加,filename到每個檔案的標題和檔案中{}每一行的檔案名。
注意s#...#...#在第二個 sed 命令中使用替代分隔符以允許檔案名斜線。還應該在dataset目錄中執行查找。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350292.html
