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"