具有固定宽度列的文件内的分割线

具有固定宽度列的文件内的分割线

如何从results.txt以此类行命名的文件中删除虚拟信息?

文件内的行如下所示:

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

...并且它们应该更改为制表符分隔格式,如下所示:

0001    00000000    0.0000  mW  
0001    00000050    117.5261    uW  

答案1

使用sed代替怎么样awk

sed -r 's/^_my([0-9]+)_split([0-9]+)\.txt:[^=]*=\s*([0-9.]+) *(\S+).*/\1\t\2\t\3 \4/' /path/to/file

答案2

如果你有 GNU awk,那么你确实可以指定固定的字段宽度,例如

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

但是,您也可以考虑基于正则表达式的解决方案 - 例如,perl您可以将前三个数值加上功率单位打印为:

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

答案3

做在awk.例如:

$ 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

但它确实不是完成这项工作的最佳工具。当您想要不加更改地提取字段时,awk 会表现出色,但当您需要编辑它们时,它可能会变得很麻烦。

我会使用类似的东西:

$ 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

答案4

sed 's/_my//;s/_split/\i/;s/\.txt:Total Dynamic Power *= */\i/' /path/to/input

相关内容