잘라내기로 묶인 구분 기호 제외

잘라내기로 묶인 구분 기호 제외

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"

관련 정보