bash
주소록에 대한 스크립트를 작성 중입니다. 알파벳이 변경되면 알파벳 레코드를 빈 줄로 구분할 수 없다는 점을 제외하면 이제 모든 것이 잘 작동합니다. awk를 사용하여 정렬되고 제공되는 파일이 있습니다. 출력은 다음과 같습니다.
Anand Anju
Anand Sanjay
Das Ajay
Deshpande Shweta
Kanetkar Ashok
Kanetkar Jyoti
Sabane Dhananjay
Sahani Surinder
아래와 같은 출력을 생성하고 싶습니다.
Anand Anju
Anand Sanjay
Das Ajay
Deshpande Shweta
Kanetkar Ashok
Kanetkar Jyoti
Sabane Dhananjay
Sahani Surinder
나는 효과적인 솔루션을 원합니다 awk
.
답변1
awk
현재 입력 줄의 첫 번째 문자를 선택하는 데 사용됩니다 . 첫 번째 문자가 이전 줄과 다른 경우 빈 줄이 출력됩니다. 줄의 첫 번째 문자를 기억하고 현재 줄을 인쇄합니다. 이렇게 하면 첫 번째 문자가 이전 줄의 첫 번째 문자에서 변경되면 각 줄 앞에 빈 줄이 출력됩니다.
$ awk '{ cur = substr($0,1,1) } NR > 1 && cur != prev { print "" } { prev = cur; print }' file
Anand Anju
Anand Sanjay
Das Ajay
Deshpande Shweta
Kanetkar Ashok
Kanetkar Jyoti
Sabane Dhananjay
Sahani Surinder
답변2
다른앗해결책:
awk 'NR>1 && a && substr($1,1,1)!=a{ print "" }{ a=substr($1,1,1) }1' file
substr($1,1,1)
- 첫 번째 필드에서 첫 번째 문자를 추출합니다.
답변3
awk '{A[$1]++;if(A[$1]==1){printf("\n")}}1' FS= file
답변4
다음 줄을 패턴 공간에 축적하고 패턴 공간의 첫 번째 문자를 패턴 공간의 마지막 줄의 첫 번째 문자와 비교합니다.
일치하는 항목이 있으면 패턴 공간에 다른 줄을 추가합니다. 이제 eof를 만나면 즉시 명령을 종료( )하여 실행하므로 이 기능을 활용하기 위해 N
접두사를 사용하지 않습니다 .$!
그렇지 않으면 블록 끝에 개행 문자를 배치합니다.
GNU sed가 사용된다고 가정합니다.
sed -e '
:a;N
/^\(.\).*\n\1[^\n]*$/ba
h;s/\(.*\n\).*/\1/p
g;s/.*\(\n\)/\1/;D
' file.txt
결과
Anand Anju
Anand Sanjay
Das Ajay
Deshpande Shweta
Kanetkar Ashok
Kanetkar Jyoti
Sabane Dhananjay
Sahani Surinder