awk: 잘못된 위치에서 개행 구분 기호 처리

awk: 잘못된 위치에서 개행 구분 기호 처리

다음과 같은 데이터가 있습니다.

abc


123
456
789
def


111
222
333
ghi


999
888
777
666

즉, 레코드가 여러 줄 바꿈으로 구분되어 있지만 위치가 잘못되었습니다. 내가 원하는 것은 다음과 같이 얻는 것입니다.

abc
123
456
789

def
111
222
333

ghi
999
888
777
666

awk 에서 설정 RS을 시도했지만 \n\n\n결과적으로 레코드가 잘못 절단되었습니다. 해당 abc용어는 현재 레코드의 첫 번째 필드가 아닌 이전 레코드의 마지막 필드로 끝났습니다.

sed또한 한 줄씩 작동하기 때문에 어떻게 사용하는지 모르겠습니다 .

답변1

노력하다

awk '!NF {next} /[^0-9]/ {printf XRS; XRS = ORS} 1' file2
abc
123
456
789

def
111
222
333

ghi
999
888
777

빈 줄을 제거합니다(귀하의 사양에서 이 줄은 실제로 비어 있고, 공백이 없다는 것을 읽었습니다.). 그런 다음 레코드 헤더를 나타내는 숫자가 아닌 숫자가 있는지 확인하고, 첫 번째 줄을 제외하고 줄 바꿈을 인쇄합니다. 빈 문자열 .

답변2

모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.

$ awk '/[^0-9]/ && NR>1{print ""} NF' file
abc
123
456
789

def
111
222
333

ghi
999
888
777
666

답변3

GNU sed:

sed '1b;/^$/d;/[a-z]/s/^/\n/' file

문자열에 문자가 있으면 그 앞에 개행 문자가 삽입됩니다.

답변4

사용 sed:

sed -n '/^$/d;/^[0-9]*$/{h;n;//!ba;x;G;;p;d};p;d;:a H;g;s/\n/\n\n/;p;' sample.txt

사용 awk:

awk '
         NF && /^[0-9]*$/{f = 1;print} 
         NF && f && /^[^0-9]*$/{print "\n" $0; f = 0} 
         NR == 1
   ' sample.txt

사용 perl:

perl -alne 'if(/^\S/){$_ = (/^\d/ || $. == 1) ? $_ : "\n$_";print}' sample.txt

관련 정보