gawk
csv 파일 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에서 위의 내용을 사용하는 데 문제가 있을 수 있습니다.
- https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html
- https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html
그렇다면 다음 방법 중 하나로 이러한 오류를 해결할 수 있습니다.
NF
예를 들어 첫 번째 줄에 추가하는 등 스크립트 시작 부분에 인용하는{ NF }
것이 필요하지만, 그래도 작동하지 않으면FPAT
스크립트 시작 부분을 지운 다음 다시 할당합니다(예:{ oFPAT=FPAT; FPAT=""; FPAT=oFPAT }
첫 번째 줄로 추가).
답변2
awk -F ',"' 'NR>1{gsub(/\"/,"",$1);print $1}' filename
산출
a,a
c