여러 열 쌓기

여러 열 쌓기

N = 홀수마다 N+1번째 열이 N번째 열의 끝에 배치되도록 파일을 변경하고 싶습니다. 예를 들어, 4개의 열이 있는 파일이 있는 경우 열 2는 열 1의 끝에 붙여넣고 열 4는 열 3의 끝에 붙여넣습니다.

예시 파일:

1 2 3 4
1 2 3 4
1 2 3 4

결과물 파일:

1 3
1 3
1 3
2 4
2 4
2 4

내 파일에는 ~100개의 행과 ~60000개의 열이 있습니다.

답변1

배시 사용:

#!/bin/bash

for c in 0 1; do
  while read -r -a columns; do
    for((i=$c; i<${#columns[@]}; i+=2)); do
      echo -n "${columns[$i]} "
    done
    echo
  done < file
done

산출:

1 3
1 3
1 3
스물넷
스물넷
스물넷

답변2

다음은 꽤 비밀스러운 awk입니다.

awk '{for (i=1; i<=NF; i+=2) {printf "%s ", $(i + (NR > FNR))}; print ""}' file file

파일이 처음 처리되면 NR > FNRfalse(0)가 됩니다.
파일이 두 번째로 처리되면 NR > FNRtrue, 즉 1이 됩니다.


이를 위해서는 파일을 한 번만 통과해야 하지만 파일의 절반을 메모리에 유지해야 합니다.

awk '
    {
        for (i=1; i<NF; i+=2) {
            printf "%s ", $i
            row[NR] = row[NR] $(i+1) " "
        }
        print ""
    }
    END {
        for (i=1; i<=NR; i++) print row[i]
    }
' file

관련 정보