내가 그렇게 같은 탈출 쉼표로 문자열을 가지고 있다면 :awk로 이스케이프 된 구분 기호 (쉼표)를 무시합니까?
a,b,{c\,d\,e},f,g
어떻게 다음 항목에 해당 구문 분석 AWK을 할 수 있습니까? 내가 AWK 생각하지 않는다
a
b
{c\,d\,e}
f
g
내가 그렇게 같은 탈출 쉼표로 문자열을 가지고 있다면 :awk로 이스케이프 된 구분 기호 (쉼표)를 무시합니까?
a,b,{c\,d\,e},f,g
어떻게 다음 항목에 해당 구문 분석 AWK을 할 수 있습니까? 내가 AWK 생각하지 않는다
a
b
{c\,d\,e}
f
g
{
split($0, a, /,/)
j=1
for(i=1; i<=length(a); ++i) {
if(match(b[j], /\\$/)) {
b[j]=b[j] "," a[i]
} else {
b[++j] = a[i]
}
}
for(k=2; k<=length(b); ++k) {
print b[k]
}
}
,
을'b
을 a
에서, '\
'b
(참고로 끝나는 선 병합 : 시작을 첫 번째 항목이 비어 있기 때문에 2시에)이 솔루션은 '\
'으로 이스케이프 한 문자는 ',
'이라고 가정합니다. 즉, 입력에 \\
이나 \\\,\\,\\\\,,\,
과 같은 이상한 조합을 처리 할 필요가 없습니다.
{
gsub("\\\\,", "!Q!")
n = split($0, a, ",")
for (i = 1; i <= n; ++i) {
gsub("!Q!", "\\,", a[i])
print a[i]
}
}
은 내장 지원과 같은 뭔가를 가지고있다. DigitalRoss만큼 짧지는 않지만 실수로 생성 된 문자열 (! Q!)을 타격 할 위험이 없어야합니다. if
으로 테스트 했으므로 문자열 끝에 실제로 \\,
이 있는지 조심하여 확장 할 수 있습니다. 쉼표가 아닌 이스케이프 처리 된 슬래시 여야합니다. 배열 a
에
BEGIN {
FS = ","
}
{
curfield=1
for (i=1; i<=NF; i++) {
if (substr($i,length($i)) == "\\") {
fields[curfield] = fields[curfield] substr($i,1,length($i)-1) FS
} else {
fields[curfield] = fields[curfield] $i
curfield++
}
}
nf = curfield - 1
for (i=1; i<=nf; i++) {
printf("%d: %s ",i,fields[i])
}
printf("\n")
}
는
나는 이것이 당신이하고 싶은 모든 분열이라고 생각 했으므로 FS를 쉼표로 분리하도록 설정했다. 부분 문자열에서만이 작업을 수행하려는 경우 동일한 방법의 시스템 PAUSE 버전을 사용하십시오. – Cascabel
** 텍스트에'! Q!'가없는 한 작동합니다. –