Исключая вложенные разделители с вырезом

Исключая вложенные разделители с вырезом

Допустим, у меня есть CSV-файл:

"col1","col2","col3"
"col4","col5,subtext","col6

У меня возникла следующая проблема:

cut -d, -f1,2 test.txt
"coll1","col2"
"col4","col5

Желаемый результат:

"col1","col2"
"col4","col5,subtext"

решение1

Модуль ParseWords, который поставляется с Perl, решает эту задачу довольно элегантно. Пример ниже.

$ perl -MText::ParseWords -nE '@a=quotewords ",",1,$_;say $a[0],",",$a[1]' <test.txt
"col1","col2"
"col4","col5,subtext"
$

решение2

Если у вас есть gawkдоступ к v4, прекрасное решение есть наРазбор CSV с использованием awk и игнорирование запятых внутри поля

Пример:

gawk -vFPAT='[^,]*|"[^"]*"' '{print $1 "," $2}' test.txt

решение3

Другое perlрешение, предполагающее, что все поля заключены в кавычки

$ perl -F'/"\K,(?=")/' -lane 'print "$F[0],$F[1]"' test.txt 
"col1","col2"
"col4","col5,subtext"
  • -F'/"\K,(?=")/'Разделителем полей является запятая, только если ей предшествует "и за ней следует"
  • print "$F[0],$F[1]"вывести первые два поля, разделенные,


Можно сделать grepи с

$ grep -oE '^"[^"]*","[^"]*"' test.txt 
"col1","col2"
"col4","col5,subtext"

Если необходимо N полей, используйте , grep -oE '^("[^"]*",){1}"[^"]*"'где число {}внутриN-1

решение4

Вы также можете попробовать сделать это с помощью awk, как показано ниже;

awk -F'","'  '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt 

Например;

user@host$ awk -F'","'  '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt 
"col1","col2"
"col4","col5,subtext"

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