剪下數組列並將另一列連接到 csv 文件

剪下數組列並將另一列連接到 csv 文件

我有一個 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)

相關內容