고정 너비 열이 있는 파일 내부의 줄 분할

고정 너비 열이 있는 파일 내부의 줄 분할

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

관련 정보