정렬 - 정렬된 목록에서 동일한 문자로 시작하는 각 그룹 앞에 임의의 문자열을 추가합니다.

정렬 - 정렬된 목록에서 동일한 문자로 시작하는 각 그룹 앞에 임의의 문자열을 추가합니다.

다음 목록(입력)이 주어지면:

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현재 레코드(입력 라인)를 인쇄합니다.

관련 정보