AWK로 탈출 한 구분 제 (Commas)를 무시합니까?
문제
내가와 같이 탈출 한 쉼표가있는 줄이 있다면 :
a,b,{c\,d\,e},f,g
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]
}
}
- 배열로 나뉩니다
a
, 사용 ',
'구분자로서 - 배열을 빌드하십시오
b
~에서a
, 끝나는 라인 합병 '\
' - 인쇄 배열
b
(참고 : 첫 번째 항목이 비어 있기 때문에 2시에 시작)
이 솔루션은 (지금) '라고 가정합니다.,
''도망친 유일한 인물 '\
'-그것은 어떤 것도 처리 할 필요가 없습니다. \\
입력에서, 그리고와 같은 이상한 조합 \\\,\\,\\\\,,\,
.
다른 팁
{
gsub("\\\\,", "!Q!")
n = split($0, a, ",")
for (i = 1; i <= n; ++i) {
gsub("!Q!", "\\,", a[i])
print a[i]
}
}
나는 Awk가 이와 같은 것에 대한 내장 지원이 있다고 생각하지 않습니다. 다음은 DigitalRoss만큼 짧지는 않지만 실수로 메이크업 문자열 (! Q!)에 닿을 위험이없는 솔루션이 있습니다. 그것은 AN과 함께 테스트하기 때문에 if
, 당신은 또한 당신이 실제로 가지고 있는지에 대해주의를 기울여 확장 할 수 있습니다. \\,
끈의 끝에서 쉼표가 아닌 탈출 한 슬래시가되어야합니다.
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")
}
제휴하지 않습니다 StackOverflow