como selecionar parte da linha e colando para formar outro arquivo?

1

Quero que você me ajude a organizar meus dados cortando da seguinte maneira. Eu tenho os dados de entrada como abaixo.

input.file:

1   2   1   0.6007  0.1 0.3 0.2 0.7 0.7 0   2   0.3073  0.1 0.1 0.2 0.4 0.7 0.5
2   2   1   0.4022  0.1 0.3 0.2 0.7 0.7 0   2   0.5085  0.1 0.1 0.2 0.4 0.7 0.5
3   2   1   0.0029  0.1 0.3 0.2 0.7 0.7 0   2   0.9078  0.1 0.1 0.2 0.4 0.7 0.5
4   2   1   0.0692  0.1 0.3 0.2 0.7 0.7 0   2   0.8805  0.1 0.1 0.2 0.4 0.7 0.5

Meu arquivo de saída desejado ficaria assim:

out.file:

1   2                               
        0.6007  1   0.1 0.3 0.2 0.7 0.7 0
        0.3073  2   0.1 0.1 0.2 0.4 0.7 0.5
2   2                               
        0.4022  1   0.1 0.3 0.2 0.7 0.7 0
        0.5085  2   0.1 0.1 0.2 0.4 0.7 0.5
3   2                               
        0.0029  1   0.1 0.3 0.2 0.7 0.7 0
        0.9078  2   0.1 0.1 0.2 0.4 0.7 0.5
4   2                               
        0.0692  1   0.1 0.3 0.2 0.7 0.7 0
        0.8805  2   0.1 0.1 0.2 0.4 0.7 0.5
    
por AiB 02.09.2013 / 23:58

2 respostas

2

Estamos nisso de novo slm :)

Mecanismo semelhante em perl, a partir da linha de comando:

perl -ane 'print "$F[0]   $F[1]\n        $F[3]   $F[2]   @F[4..9]\n" .
    "        $F[11]   $F[10]   @F[12..17]\n"' inputfile

-n processa cada linha de inputfile como um loop. -a divide cada linha em torno do separador de campos (que usa como padrão espaço) e atribui à matriz especial @F e -e passa para o comando perl especificado (que simplesmente imprime os elementos na ordem exigida com o espaçamento e novas linhas, quando necessário).

Para colocá-lo em um arquivo de script perl:

#! /usr/bin/perl -an 

print "$F[0]   $F[1]\n        $F[3]   $F[2]   @F[4..9]\n" .
     "        $F[11]   $F[10]   @F[12..17]\n";

Chmod o arquivo ( chmod u+x perlscript ), então simplesmente execute ./perlscript inputfile .

E se você precisar da saída em um arquivo diferente, basta colocar > outputfile no final do comando (isto é o mesmo para o primeiro exemplo a ser usado diretamente na linha de comando)

./perlscript inputfile > outputfile
    
por 03.09.2013 / 00:28
2

Aqui está o modo de força bruta usando awk :

$ awk '
    {print $1"   "$2}
    {print "\t"$4"  "$3"   "$5,$6,$7,$8,$9,$10}
    {print "\t"$12"  "$11"   "$13,$14,$15,$16,$17,$18}
  ' input.file
1   2
        0.6007  1   0.1 0.3 0.2 0.7 0.7 0
        0.3073  2   0.1 0.1 0.2 0.4 0.7 0.5
2   2
        0.4022  1   0.1 0.3 0.2 0.7 0.7 0
        0.5085  2   0.1 0.1 0.2 0.4 0.7 0.5
3   2
        0.0029  1   0.1 0.3 0.2 0.7 0.7 0
        0.9078  2   0.1 0.1 0.2 0.4 0.7 0.5
4   2
        0.0692  1   0.1 0.3 0.2 0.7 0.7 0
        0.8805  2   0.1 0.1 0.2 0.4 0.7 0.5

Aqui está uma versão um pouco mais compacta que usa loops para fazer as colunas que estão em série:

$ awk '
    {print $1"   "$2}
    {printf("\t%s  %s   ",$4,$3)}
    {for(i=5;i<=10;i++)printf("%s ",$i);print ""}
    {printf("\t%s  %s   ",$12,$11)}
    {for(i=13;i<=18;i++)printf("%s ",$i);print ""}
  ' input.file
    
por 03.09.2013 / 00:25