수직 배열 데이터를 수평 배열 데이터로 변환

수직 배열 데이터를 수평 배열 데이터로 변환

각각 128개의 행과 5개의 열로 구성된 25개의 행렬이 있는 파일이 있습니다. 각 행렬은 수직 방식으로 하나씩 배치됩니다. 이와 같이

파일 입력(파일 1):

Array1
Array2
Array3
...
Array25

각 배열을 수평으로 배치하고 싶습니다. 이렇게 (파일 2)

Array1  Array2  Array3 ... Array25

나는 다음 명령을 사용해 보았습니다.

pr -25t -w 4000 file1 > file2

그런데 내가 원하는 대로 되지 않네요.

답변1

각각 3줄의 배열을 포함하는 이 테스트 파일을 고려해 보겠습니다.

$ cat File
1 2
3 4
5 6
a b
c d
e f
A B
C D
E F

이제 배열을 연결해 보겠습니다.

$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File
1 2 a b A B 
3 4 c d C D 
5 6 e f E F 

데이터 파일에서 각 배열에는 128개의 행이 있습니다. 이 경우 다음을 실행합니다.

awk -v nr=128 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File

어떻게 작동하나요?

  • -v nr=128

    그러면 변수가 nr각 배열의 행 수로 설정됩니다.

  • a[NR]=$0

    NR줄 번호입니다. 각 줄을 배열로 저장합니다 a.

  • END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}

    모든 줄을 읽고 나면 원하는 형식으로 다시 작성됩니다.

    i이를 위해 로 시작 i=1하고 으로 끝나는 변수를 반복합니다 i=nr. 각각에 대해 i새로운 줄을 인쇄합니다 i. 각 값에 대해 i새 파일의 줄에 속하는 이전 파일의 줄 수를 반복합니다.jji

다양성

초보자에게는 읽기가 더 어려워지지만 삼항 문을 사용하면 형식을 약간 개선할 수 있습니다.

$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) for (j=i;j<=NR;j+=nr) printf "%s%s",a[j],(j+nr<=NR?" ":"\n")}' File
1 2 a b A B 11 22
3 4 c d C D 33 44
5 6 e f E F 55 66

j+nr<=NR?" ":"\n"삼항문. 공백을 반환하는 경우 j+nr<=NR. 그렇지 않으면 개행 문자를 반환합니다.

관련 정보