固定幅列を持つファイル内の行の分割

固定幅列を持つファイル内の行の分割

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最初の 3 つの数値と累乗単位を次のように印刷できます。

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

関連情報