CSV 파일이 있다고 가정해 보겠습니다.
"col1","col2","col3"
"col4","col5,subtext","col6
제가 겪은 문제는 다음과 같습니다.
cut -d, -f1,2 test.txt
"coll1","col2"
"col4","col5
원하는 출력은 다음과 같습니다.
"col1","col2"
"col4","col5,subtext"
답변1
Perl과 함께 제공되는 ParseWords 모듈은 이를 매우 우아하게 다룹니다. 아래 예.
$ perl -MText::ParseWords -nE '@a=quotewords ",",1,$_;say $a[0],",",$a[1]' <test.txt
"col1","col2"
"col4","col5,subtext"
$
답변2
v4를 사용할 수 있는 경우 gawk
좋은 해결책이 있습니다.awk를 사용하여 csv를 구문 분석하고 필드 내의 쉼표를 무시합니다.
예:
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"