각각 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
새 파일의 줄에 속하는 이전 파일의 줄 수를 반복합니다.j
j
i
다양성
초보자에게는 읽기가 더 어려워지지만 삼항 문을 사용하면 형식을 약간 개선할 수 있습니다.
$ 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
. 그렇지 않으면 개행 문자를 반환합니다.