Imprimindo todas as colunas N no novo arquivo

2

Como imprimir cada 100 colunas de um arquivo com 1000 colunas em 10 arquivos diferentes? O comando split é usado para dividir as linhas em arquivos diferentes. Estou procurando colunas em arquivos diferentes.

    
por Radhakrishnan Rk 01.10.2017 / 14:25

4 respostas

1

Com bash e cut :

#! /usr/bin/env bash
for i in {0..9}; do
    let start=i*100+1
    let end=i*100+100
    cut -d ' ' -f ${start}-${end} file.txt >file_$i.txt
done
    
por 01.10.2017 / 20:02
2

Se o arquivo não for muito grande, uma opção pode ser transpor, dividir e, em seguida, transpor o resultado. se você tem o GNU split com a opção --filter

rs -T < somefile | split -l100 --filter='rs -T > $FILE'

Ilustrando com uma entrada de tamanho mais gerenciável

$ printf 'A B C D E F G H I J\n0 1 2 3 4 5 6 7 8 9\na b c d e f g h i j\n' | 
    rs -T | split -l2 --filter='rs -T > $FILE'

Então

$ cat xaa
A  B
0  1
a  b

$ cat xae
I  J
8  9
i  j
    
por 01.10.2017 / 16:11
1

Usando awk sozinho.

awk '{i=0; split($0, arry, / +/); 
    for (x in arry) {
        if ((x%100)==1)i++; printf (x%100)?arry[x]FS:arry[x]"\n" >"FILE_"i
    }
}' in_multiple_files

Entrada simples de 40 colunas e com x%10 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26 c27 c28 c29 c30 c31 c32 c33 c34 c35 c36 c37 c38 c39 c40
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN

Resultado em 4 arquivos.

==> FILE_1 <==
1 2 3 4 5 6 7 8 9 10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
A B C D E F G H I J

==> FILE_2 <==
11 12 13 14 15 16 17 18 19 20
c11 c12 c13 c14 c15 c16 c17 c18 c19 c20
K L M N O P Q R S T

==> FILE_3 <==
21 22 23 24 25 26 27 28 29 30
c21 c22 c23 c24 c25 c26 c27 c28 c29 c30
U V W X Y Z AA AB AC AD

==> FILE_4 <==
31 32 33 34 35 36 37 38 39 40
c31 c32 c33 c34 c35 c36 c37 c38 c39 c40
AE AF AG AH AI AJ AK AL AM AN
    
por 01.10.2017 / 16:29
1
Solução

Awk :

awk -v n=100 '{ r=""; 
                for(i=1;i<=NF;i++) { 
                    f=sprintf("%s%s",$i,(!(i%n))?"":OFS); 
                    r=(r!="")? r OFS f : f; 
                    if (!(i%n)) { print r > FILENAME"_"++c; r="" } 
                } 
                c=0 }' file
  • -v n=100 - coeficiente de divisão ajustável

  • r="" - string resultante inicializada

  • !(i%n) - determinando o momento em que o registro deve ser dividido no múltiplo do número do campo do coeficiente n

por 01.10.2017 / 17:28