Dividir linhas dentro de arquivos com colunas de largura fixa

3

Como posso remover informações falsas de um arquivo chamado results.txt com linhas como essa?

As linhas dentro do arquivo são assim:

_my0001_split00000000.txt:Total Dynamic Power    =   0.0000 mW        
_my0001_split00000050.txt:Total Dynamic Power    = 117.5261 uW  (100%)

... e eles devem mudar para um formato separado por tabulações como este:

0001    00000000    0.0000  mW  
0001    00000050    117.5261    uW  
    
por VSB 06.01.2017 / 18:09

4 respostas

6

Que tal usar sed em vez de awk ?

sed -r 's/^_my([0-9]+)_split([0-9]+)\.txt:[^=]*=\s*([0-9.]+) *(\S+).*/\t\t /' /path/to/file
    
por 06.01.2017 / 18:22
6

Se você tiver o GNU awk , poderá especificar as larguras de campo fixas, por exemplo,

gawk -vFIELDWIDTHS="3 4 6 8 30 8 1 3" -vOFS="\t" '{print $2,$4,$6,$8}' results.txt
0001    00000000          0.0000        mW
0001    00000050        117.5261        uW

No entanto, você também pode considerar uma solução baseada em expressões regulares - por exemplo, em perl você pode imprimir os três primeiros valores numéricos mais unidades de energia como:

perl -lne 'print join "\t", (/\d*\.?\d+|\b.W\b/g)[0..3]' results.txt
0001    00000000        0.0000  mW
0001    00000050        117.5261        uW
    
por 06.01.2017 / 19:21
4

Você pode fazer isso em awk . Por exemplo:

$ awk -vOFS="\t" '{ 
                    sub(/.txt:.*= */," "); 
                    sub(/^.../,"",$1); 
                    sub(/_split/, "\t",$1); 
                    print $1,$2,$3
                  }' file  
0001    00000000    0.0000  mW
0001    00000050    117.5261    uW

Não é a melhor ferramenta para o trabalho. O Awk se destaca quando você deseja extrair os campos inalterados, pode ser complicado quando você precisa editá-los.

Eu preferiria usar algo como:

$ perl -lne '
    @m=(/\D+(\d+)\D+(\d+).*=\s*([0-9.]+)\s+(\S+).*$/); 
    print join "\t", @m' file 
0001    00000000    0.0000  mW
0001    00000050    117.5261    uW
    
por 06.01.2017 / 19:41
3
sed 's/_my//;s/_split/\i/;s/\.txt:Total Dynamic Power *= */\i/' /path/to/input
    
por 06.01.2017 / 18:22