Допустим, у меня есть 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"