단일 열을 3개 열로 변환하는 방법은 무엇입니까?

단일 열을 3개 열로 변환하는 방법은 무엇입니까?

다음 형식의 데이터가 포함된 큰 텍스트 파일이 있습니다.

1
2
3
4
5
6
7
8
9
10

나는 그것을 다음과 같이 변환하려고합니다 :

1           2             3
4           5             6
7           8             9
10

나는 시도했다 awk:

'{ if (NR%2) {printf "%40s\n", $0} else {printf "%80s\n", $0} }' file.txt

답변1

솔루션 paste

seq 10 | paste - - -
1       2       3
4       5       6
7       8       9
10

paste최소 12개 열에서 작동하도록 보장하는 Unix 표준 도구입니다.

답변2

columns도구는 다음을 수행할 수 있습니다.

$ seq 10 | columns -W 16 -c 3
1     2     3
4     5     6
7     8     9
10

-W 16선 너비를 더 작게 설정하면 됩니다.

columnsUnix 표준 도구가 아닙니다. 그것은 일부이다GNU 자동 생성.

보다 일반적인 column명령의 일부 버전에서는 열 수를 설정하는 데 사용할 수 있지만 -c최신 버전에서는 행 너비를 문자 수로 설정하도록 의미가 변경된 것 같습니다.

또한 prmpez0이 의견에서 제안한 대로:

$ seq 10 | pr -aT3
1           2           3
4           5           6
7           8           9
10

-aT3응 줄임말 --across --omit-pagination --columns=3.

pr-T/는 --omit-paginationGNU에만 적용되는 것처럼 보이지만 coreutils와 POSIX에도 있습니다.

답변3

다음과 같은 것을 시도해보세요

seq 1 10 | awk '{printf "%40s", $0} !(NR%3) {printf "\n"}'
                                       1                                       2                                       3
                                       4                                       5                                       6
                                       7                                       8                                       9
                                      10

답변4

그러면 각 입력 줄의 문자열 너비가 40, 80 및 120 사이에서 번갈아 표시됩니다.

awk '{ m = (NR-1) % 3; i = (m+1) * 40; printf "%*s\n", i, $0 }'

변하기 쉬운:

  • m- 줄 번호 모듈로 3(예: 0, 1, 2반복)
  • i- 주어진 m 값에 대한 들여쓰기

다른 지침 없이 printf입력의 각 줄이 자체 출력 줄로 형식화되고 각 줄이 사용 가능한 공간에 오른쪽 정렬되도록 사용자 고유의 형식을 사용하여 진행합니다.

예제와 같이 행당 40열 항목 3개를 원하는 경우 코드 대신 이 옵션을 사용할 수 있습니다(텍스트를 왼쪽 정렬하려면 이 옵션으로 변경) 40s.-40s

awk '{ printf "%40s", $0 } !(NR % 3) { printf "\n" }'

관련 정보