вырезать столбец массива и присоединить другой столбец к 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

Если вы не хотите использовать специально разработанный парсер CSV, как предлагает @steeldrive, вы можете использовать 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)

Связанный контент