2017-05-18 64 views
-1

我有一個以下格式的文件。bash:用部分空格填充的字符串替換文本

33256SOL OW 100092 1.507 1.186 0.847 
33256SOL HW1100093 1.561 1.233 0.783 
... 

而且我想將其更改爲

33256SOL OW  92 1.507 1.186 0.847 
33256SOL HW1 93 1.561 1.233 0.783 
... 

我想爲在bash循環做。但是,格式是錯誤的。沒有空格填充一致的格式。

for i in {100001..200000}; do 
     j=$(expr $i - 100000) 
     sed -i "s/$i/$j/g" number.txt 
done 

有沒有辦法用空格填充變量並放在sed中?

回答

0

AWK溶液:

awk -F"[[:space:]][[:space:]]+" '{$2=substr($2,1,3) " " substr($2,4)-100000}1' file 

輸出:

33256SOL OW 92 1.507 1.186 0.847 
33256SOL HW1 93 1.561 1.233 0.783 

  • -F"[[:space:]][[:space:]]+" - 字段分隔符(由多個空格)

  • substr($2,1,3) - 從6- difit數第二字段


爲了獲得標籤格式的輸出的減去100000只需添加 - 獲得第二場

  • substr($2,4)-100000的前3個字符OFS(輸出字段分隔符)如下:

    awk -F"[[:space:]][[:space:]]+" -v OFS="\t" '{$2=substr($2,1,3)" "substr($2,4)-100000}1' file 
    

    該outp UT:

    33256SOL OW 92 1.507 1.186 0.847 
    33256SOL HW1 93 1.561 1.233 0.783 
    
  • +0

    感謝您的建議。 但是,我的文件需要具有完整的格式,因爲稍後會進行處理,即33256SOL和OW之間必須有4個空格。這會是一個問題嗎? – Simon

    +0

    好的,這樣更好! :) –

    +0

    @Simon,這不是一個問題,改爲'-v OFS =「4空格」' – RomanPerekhrest

    0

    另一種解決方案:

    cat number.txt | cut -c -15 > prefix 
    cat number.txt | cut -c 16- | awk '{printf "%s %s %s %s\n", $1 - 100000, $2, $3, $4}' | paste prefix - 
    

    第一行恢復,我們不希望改變線的第一部分。 第二行是我們想要更改的行的一部分(cut),更改它(awk),並粘貼以前通過第一行恢復的部分(paste)。