
我有一個 CSV 文件
input.csv
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
我需要從上面的 CSV 文件中刪除數組列並獲取輸出:
output.csv
1,2,3,9,12
1,2,3,9,12
1,2,3,9,12
所以我嘗試了
cut -d , -f4 -- complement input.csv > output.csv
但上面的指令給了錯誤
分隔符必須是單一字符
我還想將 output.csv 與另一個 CSV 檔案結合起來
column.csv
30
36
90
那麼結果會是這樣的
result.csv
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
有人可以幫我嗎?
答案1
與米勒 (http://johnkerl.org/miller/doc) 從...開始
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
非常簡單,你可以運行
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv | paste -d , - column.csv
獲得
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
我cut -x -f 4
刪除了第四列並paste
新增了 column.csv 列
答案2
為了正確處理引用的分隔符,您應該考慮使用專門設計的 CSV 解析器 - 例如,來自 perl Text::CSV 模組的解析器。例如,
paste -d, input.csv column.csv | perl -MText::CSV -ne '
BEGIN {$csv = Text::CSV->new()}
if ($csv->parse($_)) {
@a = $csv->fields();
splice(@a, 3, 1);
print join(",", @a) . "\n";
}'
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
答案3
如果您不想使用 @steeldrive 建議的專門設計的 CSV 解析器,您可以使用awk
:
awk '{split($0,a,"\""); print a[1] substr(a[3],2)}' input.csv > output.csv
請注意,這僅適用於範例中提供的樣式。
解釋:
分割文字間隔"
{split($0,a,"\"")
,
列印並刪除第二列的第一列
print a[1] substr(a[3],2)