열 번호로 파일 분할

열 번호로 파일 분할

10,671개의 열이 있는 파일이 있습니다.

모든 열이 인쇄될 때까지 file_transpose01, file_transpose02, ... file_transpose10이라는 이름의 1000개의 열이 있는 10개의 작은 파일로 분할하려고 합니다. 파일의 첫 번째 열을 각각의 새 하위 파일의 첫 번째 열로 인쇄하고 있습니다.

난 그게 가능하다는 걸 알아줄 번호로 awk 사용.

NR 대신 NF를 사용하여 열로 분할하도록 이 방법을 적용하려고 합니다.

awk 'BEGIN{$1;}NF%1000==2{x="masterfile_transposed"++i;a[i]=x;print f>x;}{print > x}' masterfile

하지만 오류가 발생합니다.

expression for `>' redirection has null string value. I am not sure what is wrong with my syntax. Is it possible to do this task using awk?

이 접근 방식을 어떻게 작동하게 만들 수 있습니까? 아니면 더 나은 접근 방식이 있습니까?

답변1

awk -v ncols=1000 '
    {
        f=1
        file = "file_" f
        for (i=1; i <= NF; i++) {
            printf "%s%s", $i, OFS > file
            if (i % ncols == 0) {
                print "" > file
                f++
                file = "file_" f
            }
        }
        print "" > file
    }
' file

답변2

이 열을 무엇으로 구분하는지 모르겠지만 다음과 같은 파일을 만들었습니다.

 i=0
 until [ "$((i+=1))" -gt 100 ]
 do    seq -s '     ' 10671 
 done >/tmp/file

결과는 100개의 행과 10671개의 열이며 각각은 일련의 공백으로 구분됩니다.

다음에 내가 한 일은:

sed 's/  */\n/1000;/\n/P;//D;G' </tmp/file | sed 's/.* //'

sed데이터가 분할되는 위치를 명확하게 확인하고 싶기 때문에 두 번째 것을 사용하고 있습니다 . 단일 행에 있는 수천 개의 열을 이해하는 것은 약간 어려울 수 있습니다. 그래서 마지막 열까지 각 행을 삭제합니다. 여기를 사용할 때마다 s/.* //행의 마지막 열만 표시하고 싶기 때문입니다. 예를 들어, 처음 실행하면 인쇄됩니다...

1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
10671

...100번. 이는 각 라인이 실제로 다음과 같이 보인다는 것을 의미합니다.

1   2  3...1000
1001 1002 1003...2000

...등. sed확실히 데이터를 올바르게 분할했습니다 ...

그래서 나는 그것을 한 줄씩 별도의 파일로 나누는 것이 꽤 쉬울 것이라고 생각했습니다. 그래서 나의 다음 단계는 다음과 같습니다.

sed 's/  */\n/1000;/\n/P;//D;G' </tmp/file | 
sed -n "$(printf 'w /tmp/outfile.%d\nn\n' {1..11})"

/tmp... 모든 열이 개별적으로 분할된 11개의 파일이 생겼습니다 . 저 할 수 있어요...

sed 's/.* //' /tmp/outfile.1

...인쇄됩니다...

1000
1000
1000
1000

...25번. 또는...

sed 's/.* //' /tmp/outfile.11

...그리고...

10671
10671
10671
10671

...25번 더...

관련 정보