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 N
N은 정의된 접두사 뒤의 접미사의 자릿수입니다.)
답변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