다음과 같은 데이터가 있습니다.
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