
У меня есть 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)