dividindo um arquivo pelo número da coluna

2

Eu tenho um arquivo com 10.671 colunas.

Estou tentando dividi-lo em 10 arquivos menores, cada um com 1000 colunas até que todas as colunas tenham sido impressas, denominadas file_transposed01, file_transposed02, ... file_transposed10. Estou imprimindo a primeira coluna do arquivo como a primeira coluna para cada novo sub-arquivo.

Eu sei que é possível fazer isso pelo número da linha usando o awk .

Estou tentando adaptar essa abordagem usando NF em vez de NR para dividir por colunas:

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

Mas dá um erro:

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?

Como posso fazer essa abordagem funcionar ou há uma abordagem melhor a ser tomada?

    
por user3745089 11.01.2015 / 01:49

2 respostas

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
    
por 11.01.2015 / 14:50
1

Eu não sei o que você está delimitando essas colunas, mas eu fiz um arquivo como:

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

Que resultou em 100 linhas em 10671 colunas, uma peça delimitada em sequências de espaços.

Eu fiz em seguida:

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

Eu usei o segundo sed porque eu queria ver claramente onde os dados se dividiam - pode ser um pouco difícil fazer sentido em mil colunas em uma única linha. Então elidei cada linha à sua coluna final. Toda vez que eu uso s/.* // aqui é porque eu quero mostrar apenas a coluna final para uma linha. Por exemplo, quando eu corri isso imprimiu ...

1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
10671

... 100 vezes. E isso significa que cada linha realmente parece ...

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

... e assim por diante. sed estava definitivamente dividindo os dados corretamente ...

Então eu achei que seria realmente fácil dividir isso em arquivos separados por linha. Então, meu próximo passo foi:

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

... e acabei com 11 arquivos em /tmp em que todas as colunas foram divididas separadamente. Eu posso fazer ...

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

... e será impresso como ...

1000
1000
1000
1000

... 25 vezes. ou ...

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

... e ...

10671
10671
10671
10671

... também 25 vezes ...

    
por 11.01.2015 / 04:00