2017-08-04 18 views
-2

我有一個很長的文本文件,其中有一個靠近結尾的地方有一行,第三列== OXT。通過AWK在txt中基於模式的替換

ATOM 2439 O LEU 300  -4.699 34.599 65.335 1.00 83.23   O 
ATOM 2440 N LEU 301  -6.822 33.898 65.057 1.00 19.70   N 
ATOM 2441 CA LEU 301  -7.080 34.965 64.138 1.00 19.70   C 
ATOM 2442 CB LEU 301  -8.165 34.630 63.101 1.00 19.70   C 
ATOM 2443 CG LEU 301  -7.762 33.478 62.162 1.00 19.70   C 
ATOM 2444 CD1 LEU 301  -8.849 33.207 61.110 1.00 19.70   C 
ATOM 2445 CD2 LEU 301  -6.376 33.719 61.543 1.00 19.70   C 
ATOM 2446 C LEU 301  -7.556 36.168 64.946 1.00 19.70   C 
ATOM 2447 O LEU 301  -8.657 36.695 64.633 1.00 19.70   O 
ATOM 2448 OXT LEU 301  -6.821 36.580 65.884 1.00 19.70   O 
TER 2449  LEU 301 
HETATM 2450 NA NA 302  -13.016 13.036 54.214 1.00 44.33   NA 
HETATM 2451 O WAT 303  -18.411 13.587 59.094 1.00 27.41   O 
HETATM 2452 O WAT 304  -11.894 17.279 58.575 1.00 18.35   O 
HETATM 2453 O WAT 305  -15.811 12.728 54.157 1.00 39.81   O 

我需要修改與圖案OXT這條線(見下例)在以下的方式:在第三塔 - 替代「OXT」與「N」;在第四欄 - 用NHE替代ACE;

ATOM 2439 O LEU 300  -4.699 34.599 65.335 1.00 83.23   O 
ATOM 2440 N LEU 301  -6.822 33.898 65.057 1.00 19.70   N 
ATOM 2441 CA LEU 301  -7.080 34.965 64.138 1.00 19.70   C 
ATOM 2442 CB LEU 301  -8.165 34.630 63.101 1.00 19.70   C 
ATOM 2443 CG LEU 301  -7.762 33.478 62.162 1.00 19.70   C 
ATOM 2444 CD1 LEU 301  -8.849 33.207 61.110 1.00 19.70   C 
ATOM 2445 CD2 LEU 301  -6.376 33.719 61.543 1.00 19.70   C 
ATOM 2446 C LEU 301  -7.556 36.168 64.946 1.00 19.70   C 
ATOM 2447 O LEU 301  -8.657 36.695 64.633 1.00 19.70   O 
ATOM 2448 N NHE 301  -6.821 36.580 65.884 1.00 19.70   N 
TER 
HETATM 2450 NA NA 302  -13.016 13.036 54.214 1.00 44.33   NA 
HETATM 2451 O WAT 303  -18.411 13.587 59.094 1.00 27.41   O 
HETATM 2452 O WAT 304  -11.894 17.279 58.575 1.00 18.35   O 
HETATM 2453 O WAT 305  -15.811 12.728 54.157 1.00 39.81   O 

我曾嘗試使用

awk '$3=="OXT"{ f=1; rn=NR; $3=$NF="N"; $4="NHE" }/TER/ && f && NR-rn == 1{ $0=$1 }1' file 
:與N的最後一列替代O I需要各支柱之間保持相等的空間數字作爲文件的其餘部分換人後重要

它已經產生了一個正確的工作,但在一個新的字符串現在我有每個列之間有1個空格是錯誤的格式。

ATOM 2410 N NHE 299 -17.563 -15.711 -15.915 1.00 76.42 N 

但是我需要保持列之間的間距的原始格式作爲文件的其餘部分:

ATOM 2448 N NHE 301  -6.821 36.580 65.884 1.00 19.70   N 
+3

相同的重複的故事https://stackoverflow.com/questions/45487293/substitution-of-the-columns-found-in-pattern-via-bash – RomanPerekhrest

+0

它在替代字符串中產生正確的東西,但摧毀一些部分其餘文件:移動最後兩列,從而產生人工製品。 –

+0

@ m47730關於編輯:沒有理由不能用其他shell解決這個問題。限制只有'bash'的答案是不必要的限制。 – jpaugh

回答

0

可以通過管道將你的命令到column命令的結果:

$>awk '$3=="OXT"{ f=1; rn=NR; $3=$NF="N"; $4="NHE" }/TER/ && f && NR-rn == 1{ $0=$1 }1' f|column -t 
ATOM 2439 O LEU 300 -4.699 34.599 65.335 1.00 83.23 O 
ATOM 2440 N LEU 301 -6.822 33.898 65.057 1.00 19.70 N 
ATOM 2441 CA LEU 301 -7.080 34.965 64.138 1.00 19.70 C 
ATOM 2442 CB LEU 301 -8.165 34.630 63.101 1.00 19.70 C 
ATOM 2443 CG LEU 301 -7.762 33.478 62.162 1.00 19.70 C 
ATOM 2444 CD1 LEU 301 -8.849 33.207 61.110 1.00 19.70 C 
ATOM 2445 CD2 LEU 301 -6.376 33.719 61.543 1.00 19.70 C 
ATOM 2446 C LEU 301 -7.556 36.168 64.946 1.00 19.70 C 
ATOM 2447 O LEU 301 -8.657 36.695 64.633 1.00 19.70 O 
ATOM 2448 N NHE 301 -6.821 36.580 65.884 1.00 19.70 N 
TER 
HETATM 2450 NA NA 302 -13.016 13.036 54.214 1.00 44.33 NA 
HETATM 2451 O WAT 303 -18.411 13.587 59.094 1.00 27.41 O 
HETATM 2452 O WAT 304 -11.894 17.279 58.575 1.00 18.35 O 
HETATM 2453 O WAT 305 -15.811 12.728 54.157 1.00 39.81 O 
+0

它會在替換字符串中產生正確的輸出,但會破壞原始文件其餘部分的某些部分。在某些部分,最後兩列會被移位甚至合併在一起,從而產生錯誤的輸出文件。 –

+0

可能與'fmt'或使用'-c'選項耦合? – fredtantini

+0

像這樣它不起作用awk'$ 3 ==「OXT」{f = 1; RN = NR; $ 3 = $ NF = 「N」; $ 4 =「NHE」}/TER/&& f && NR-rn == 1 {$ 0 = $ 1} 1'file |列-t | fmt –

1

快速,非常髒:

#/bin/bash 

skip=0 
cat /tmp/list | while read line 
do 
    third=$(echo $line | awk '{print $3}') 

    if [ $skip -eq 1 ] 
    then 
    echo "TER" 
    skip=0 
    continue 
    fi 

    if [ "${third}" == "OXT" ] 
    then 
    echo "${line}" | sed 's/OXT/N /' 
    skip=1 
    continue 
    fi 

    echo "${line}" 
done 

當然/tmp /列表是具有所有值的文件。

+0

謝謝!通常它工作正常。但是如何添加sed一個額外的腳本來替換第四個值(NHE上的任何樹大寫字母)和最後一列(替換O到N)中的值。類似於第四列(不幸的是,它也會替換同一個字符串的第一列是不好的):sed -e's/OXT/N /'-e's/[[:upper:]] [[:upper: ]] [[:upper:]]/NHE/g' –

+0

@JamesStarlight用這個新問題更新你的問題;這次也輸入了輸入和預期的輸出。 在這種描述方式中,我不太確定要抓住你的目標。 – m47730