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
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
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
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
sed 's/_my//;s/_split/\i/;s/\.txt:Total Dynamic Power *= */\i/' /path/to/input