두 개의 서로 다른 문자열을 처리하기 위해 동일한 파일을 사용하고 있습니다 awk
. 그래서 유선.
cat test.awk
BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}{$4="TDP,-1,-1,0,0"OFS$4;print $0}
echo "a,b,b,b,b,b,b,b,b,b,b,b,\"a,b\"" | gawk -f test.awk
a,b,b,TDP,-1,-1,0,0,b,,b,b,b,b,b,b,b,b,"a,b"
echo "a,b,,\"a,b\""|gawk -f test.awk
a,b,,TDP,-1,-1,0,0,"a,b"
실제로 첫 번째 결과에는 ",,"가 있습니다. 하지만 1차 결과에 이어 2차 결과도 기대하고 있다.
답변1
[실제 답변은 아니지만 댓글을 달기에는 너무 큽니다.]
나생각하다당신이 보는 행동은관련된첫 번째 원자에 FPAT
- 길이가 0일 수 있습니다. 즉, ([^,])*
일치합니다 .0 이상쉼표가 아닌 문자 - 그러나 정확히 동일어떻게현재로서는 그 관련성을 이해할 수 없습니다. 예를 들어(GNU Awk 4.0.1):
$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" |
gawk '
BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}
{print $0; $4=$4; print $0; print NF}
' a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
a,b,c,d,,e,f,g,h,i,j,k,l,"m,n"
14
NF
그리고 재할당 전에 값에 액세스하면
$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" |
gawk '
BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}
{print $0; print NF; $4=$4; print $0; print NF}
'
a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
13
a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
13
FPAT
어쨌든, 비어 있지 않은 시퀀스만 일치하도록 변경하면 동작이 모호하지 않은 것 같습니다.
$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" |
gawk '
BEGIN{FPAT="([^,]+)|(\"[^\"]+\")";OFS=","}
{$4="TDP,-1,-1,0,0" OFS $4; print $0}
'
a,b,c,TDP,-1,-1,0,0,d,e,f,g,h,i,j,k,l,"m,n"