BASH의 CSV 파일에서 빈 문자열 읽기

BASH의 CSV 파일에서 빈 문자열 읽기

gawkcsv 파일 file.csv의 첫 번째 열에서 값을 읽으려면 다음 스크립트를 사용하고 있습니다 . 포함된 쉼표를 무시하고 싶지 않기 때문에
사용합니다 .gawk

col=`gawk ' 
BEGIN {
FPAT="([^,]+)|(\"[^\"]+\")"
}
{print $1 }' file.csv`

예를 들어 file.csv는 다음과 같습니다.

col1,col2
"a,a","a,a1"
,"b1"
"c","c1"

문제는 첫 번째 열의 두 번째 행이 비어 있으므로 첫 번째 열의 값을 읽을 때 두 번째 열의 값을 두 번째 행의 값으로 사용한다는 것입니다.

echo $col

반품

a,a
b1
c

하지만 다음과 같이 빈 문자열을 인식하고 싶습니다.

a,a

c

이 동작을 어떻게 달성할 수 있습니까?

감사합니다!


고쳐 쓰다:
빈 문자열/공백이 마지막 줄에 있으면 이 메서드는 이를 무시한다는 것을 알았습니다.

col=`gawk ' 
BEGIN {
FPAT="([^,]*)|(\"[^\"]*\")+"
}
{print $1 }' file.csv`

예를 들어 file.csv가 다음과 같은 경우:

col1,col2
"a,a","a,a1" 
"b","b1" 
,"c1"  

결과는 다음과 같습니다

col1
a,a
b 

바꾸다

col1
a,a
b 

이 문제를 해결하려면 어떻게 해야 합니까?

답변1

+빈 필드를 허용하려면 s(1회 이상 반복)를 *s(0회 이상 반복) 로 변경합니다.FPAT

$ awk '
BEGIN { FPAT="([^,]*)|(\"[^\"]*\")+" }
{ print $1 }
' file.csv
col1
"a,a"

"c"

+또한 인용된 필드에 이스케이프된(큰) 따옴표를 사용할 수 있도록 마지막 항목도 추가했습니다 "foo""bar".

바라보다https://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awk필드에 줄 바꿈이 포함된 경우에도 awk를 사용하여 CSV를 구문 분석하는 방법에 대한 추가 정보입니다.


의견에서 언급했듯이 이는 gawk 5.1.0 이상에서 작동하지만 FPAT처리와 관련된 2가지 버그로 인해 gawk 4.1.4에서 위의 내용을 사용하는 데 문제가 있을 수 있습니다.

  1. https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html
  2. https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html

그렇다면 다음 방법 중 하나로 이러한 오류를 해결할 수 있습니다.

  1. NF예를 들어 첫 번째 줄에 추가하는 등 스크립트 시작 부분에 인용하는 { NF }것이 필요하지만, 그래도 작동하지 않으면
  2. FPAT스크립트 시작 부분을 지운 다음 다시 할당합니다(예: { oFPAT=FPAT; FPAT=""; FPAT=oFPAT }첫 번째 줄로 추가).

답변2

awk -F ',"' 'NR>1{gsub(/\"/,"",$1);print $1}' filename

산출

a,a

c

관련 정보