텍스트 처리 블록 행에서 열까지

텍스트 처리 블록 행에서 열까지

Solaris 목록이 포함된 파일이 있습니다.

List A
hi
hello
hw r u

List B
Hi
Yes

List C
Hello

목록을 다음과 같이 바꿔야 합니다.

List A    List B    List C
hi        Hi        Hello
hello     Yes
hw r u

Solaris에서 이 작업을 어떻게 수행합니까?

답변1

awk각 청크를 별도의 파일로 분할하여 함께 넣을 수 있습니다 paste(다음에서는 각 목록 사이에 항상 빈 줄이 있다고 가정합니다).

awk '/^$/ {N++;next}{print >"file"N}' infile.txt
paste file*

paste명령을 로 이동할 수도 있습니다 awk.

awk '/^$/ {N++;next}{print >"file"N} END{system("paste file*")}' inile.txt

출력은 다음과 같습니다

List A    List B    List C
hi        Hi        Hello
hello     Yes
hw r u

줄 길이를 변경하면 다음과 같은 아름다운 들여쓰기가 생성됩니다.

입력 파일:

list A
hi
hello
hw r u

List B
Hi this is list B
Yes

List C
Hello, this is list C

넌 할 수있어paste file* |column -s $'\t' -tn결과를 얻을 것입니다 :

list A  List B             List C
hi      Hi this is list B  Hello, this is list C
hello   Yes
hw r u

답변2

이전 답변 외에도csplit, 동일한 방식으로 파일을 분할한 다음 해당 명령을 사용하여 paste원하는 출력을 얻는 명령 도 있습니다 .

csplit -zs -f outputfile inputfile '/^List/' '{*}'
paste outfile*
  • '/^List/'파일을 일치시키고 다음 새 파일로 나누는 패턴입니다.
  • '{*}'패턴을 최대한 많이 반복하세요
  • -z빈 출력 파일을 삭제하는 데 사용되며 -s출력 파일 크기 수를 인쇄하지 않는 데 사용됩니다.
  • -f사용자 정의 접두사를 정의하는 데 사용됩니다.결과물 파일 ####기본값은 2자리이며 다음을 사용하여 정의할 수 있습니다. ( -n NN은 정의된 접두사 뒤의 접미사의 자릿수입니다.)

답변3

암소 비슷한 일종의 영양방법:

awk 'BEGIN{ max=0 }
     /^List/{ if(k && k>max) { max=k; idx=c } ++c; k=0 }
     NF{ a[c][++k]=$0 }
     END{ 
         for(i=1;i<=max;i++) 
             for(j=1;j<=c;j++) printf "%s%s",a[j][i],(j==c)?ORS:"\t" 
     }' file | column -ts$'\t'

산출:

List A  List B  List C
hi      Hi      Hello
hello   Yes
hw r u

답변4

주문하다

for i in "List A" "List B" "List C"; do sed -n "/$i/,/^$/p" h.txt >"$i.txt"; done

paste List\ *

산출

List A  List B  List C
hi  Hi  Hello
hello   Yes 
hw r u      

관련 정보