다음 목록(입력)이 주어지면:
apple
banana
blueberry
mango
melon
나는 다음과 같은 출력을 원합니다.
== A ==
apple
== B ==
banana
blueberry
== M ==
mango
melon
awk
다른 텍스트 처리 유틸리티를 사용하여 쉘 스크립트에서 이 작업을 수행할 수 있습니까 ?
답변1
awk -F '' '
{ if (NF != 0)
{ if (toupper($1) != c)
{ if (c != "") print ""
c = toupper($1)
print "== "c" =="
}
print
}
}'
설명하다:
-F ''
awk
문자가 필드로 처리되도록 합니다 . 이것은awk
확실히 GNU( )에서 작동합니다gawk
. 다른 구현에서는 이를 지원할 수도 있고 지원하지 않을 수도 있습니다. POSIX에서는 "FS
빈 문자열인 경우 동작이 지정되지 않습니다"라고 말합니다.if (NF != 0)
빈 줄을 무시하는 역할을 담당합니다. 구체적인 행동을 지정하지는 않았지만 그것이 맞다고 생각합니다.c
이전 첫 번째 문자의 대문자 버전을 저장합니다.if (toupper($1) != c)
현재 레코드(즉, 입력 줄)의 첫 번째 필드(즉, 첫 번째 문자)의 대문자 버전이 저장된 값과 다른지 확인합니다. 이 코드는 비어 있지 않은 첫 번째 줄이 나타날 때 처음으로 실행됩니다. 이는c
할당되기 전에 발생하며 조건은 기본적으로 true입니다. 이는 다음 줄에 해당할 수도 있고 그렇지 않을 수도 있습니다.if (c != "") print ""
c
아무것도 저장되지 않은 경우(아직 그룹이 인쇄되지 않았음을 의미) 빈 줄을 별도의 그룹으로 인쇄합니다 . 이렇게 하면 출력의 첫 번째 그룹 앞에 빈 줄이 생기는 것을 방지할 수 있습니다.c = toupper($1)
갱신하다c
.print "== "c" =="
요청한 그룹 제목을 인쇄합니다.print
현재 레코드(입력 라인)를 인쇄합니다.