Como imprimir a segunda coluna de muitos arquivos?

2

Eu tenho mais de 10 arquivos, a primeira coluna é a mesma em todos os arquivos, eu preciso coletar todas as colunas 2 em todos os arquivos contra a primeira coluna em um arquivo. Eu tentei com colar então awk mas isso imprimir apenas as colunas nos primeiros 10 arquivos

paste p{01..20}.dat | awk '{print $1" "$2" "$4" "$6" "$8" "$10" "$12" "$14" "$16"  "$18" "$20}' > output.dat

exemplo para o arquivo p01.dat

0.000 1.3594
0.500 1.3600
1.000 1.3603
1.500 1.3601
2.000 1.3595
2.500 1.3584
3.000 1.3570
3.500 1.3552
4.000 1.3530
4.500 1.3506

todos os outros arquivos têm o mesmo formato e a mesma primeira coluna

    
por Mohsen El-Tahawy 13.11.2017 / 23:07

3 respostas

4

Apenas uma variante da solução @ John1024:

paste -d '=' p*.dat | sed 's/=\S*//g'
    
por 14.11.2017 / 00:49
2

Você precisa de um loop for . Experimente:

paste p{01..20}.dat | awk '{printf "%s",$1; for (i=2;i<=NF;i=i+2) printf " %s",$i; print ""}'

Exemplo

Vamos pegar três arquivos de entrada:

$ paste p*.dat
1 a     1 aa    1 aaa
2 b     2 bb    2 bbb
3 c     3 cc    3 ccc

Nosso comando gera:

$ paste p*.dat | awk '{printf "%s",$1; for (i=2;i<=NF;i=i+2) printf " %s",$i; print ""}'
1 a aa aaa a a a a a a a a a a a a a a a a a
2 b bb bbb b b b b b b b b b b b b b b b b b
3 c cc ccc c c c c c c c c c c c c c c c c c

Exemplo usando 20 arquivos

Vamos começar com os três arquivos acima e criar mais 17:

for i in {04..20}; do cp p01.dat p$i.dat; done

Podemos verificar se a colagem funciona:

$ paste p{01..20}.dat
1 a     1 aa    1 aaa   1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a     1 a
2 b     2 bb    2 bbb   2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b     2 b
3 c     3 cc    3 ccc   3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c     3 c

Também podemos verificar se o comando awk funciona:

$ paste p{01..20}.dat | awk '{printf "%s",$1; for (i=2;i<=NF;i=i+2) printf " %s",$i; print ""}'
1 a aa aaa a a a a a a a a a a a a a a a a a
2 b bb bbb b b b b b b b b b b b b b b b b b
3 c cc ccc c c c c c c c c c c c c c c c c c
    
por 13.11.2017 / 23:23
2

paste + cut + seq truque:

paste -d' ' p{01..20}.dat | cut -d' ' -f1,"$(seq -s',' 2 2 20)"

Caso de teste (em 3 arquivos):

$ head p0[1-3].dat
==> p01.dat <==
0.000 1.3594
0.500 1.3600
1.000 1.3603
1.500 1.3601
2.000 1.3595
2.500 1.3584
3.000 1.3570
3.500 1.3552
4.000 1.3530
4.500 1.3506

==> p02.dat <==
0.000 2.3594
0.500 2.3600
1.000 2.3603
1.500 2.3601
2.000 2.3595
2.500 2.3584
3.000 2.3570
3.500 2.3552
4.000 2.3530
4.500 2.3506

==> p03.dat <==
0.000 3.3594
0.500 3.3600
1.000 3.3603
1.500 3.3601
2.000 3.3595
2.500 3.3584
3.000 3.3570
3.500 3.3552
4.000 3.3530
4.500 3.3506
paste -d' ' p{01..03}.dat | cut -d' ' -f1,"$(seq -s',' 2 2 6)"
0.000 1.3594 2.3594 3.3594
0.500 1.3600 2.3600 3.3600
1.000 1.3603 2.3603 3.3603
1.500 1.3601 2.3601 3.3601
2.000 1.3595 2.3595 3.3595
2.500 1.3584 2.3584 3.3584
3.000 1.3570 2.3570 3.3570
3.500 1.3552 2.3552 3.3552
4.000 1.3530 2.3530 3.3530
4.500 1.3506 2.3506 3.3506
    
por 14.11.2017 / 01:06

Tags