2014-02-13 79 views
-1

我有三個文件,如下所示。將三個文件的內容合併爲一個

a1.txt

>1BS3 
MDEKRRAQH 
>2ERT 
>3a56 
NEVE 

a2.txt

>1BS3 
QSKGGILS 
>2ERT 
INNWIV 
>3a56 
RRRRDK 

a3.txt

>1BS3 
>2ERT 
PDSSM 
>3a56 
ILSKASDYIQELRQSNHR 

我想上述三個文件合併到另一個文件anew.txt。我怎樣才能做到這一點?

所需的輸出

>1BS3 
MDEKRRAQHQSKGGILS 
>2ERT 
INNWIVPDSSM 
>3a56 
NEVERRRRDKILSKASDYIQELRQSNHR 

我想獲得上述順序輸出。

+1

注意這些AWK答案使用關聯數組見過的鑰匙。迭代數組的鍵時沒有固有的順序。如果這對你很重要,請告訴我們。 –

+0

非常感謝您的評論。固有順序對我來說很重要。 – user3305627

回答

1

這awk程序保持鍵的順序。它保存在一個數字索引數組

awk ' 
    /^>/ { 
     key = $0 
     if (!(key in val)) { 
      keys[++n] = key 
      val[key] = "" 
     } 
     next 
    } 
    { val[key] = val[key] $0 } 
    END { 
     for (i=1; i<=n; i++) { 
      print keys[i] 
      print val[keys[i]] 
     } 
    } 
' a{1,2,3}.txt 
>1BS3 
MDEKRRAQHQSKGGILS 
>2ERT 
INNWIVPDSSM 
>3a56 
NEVERRRRDKILSKASDYIQELRQSNHR 
+0

非常感謝。 – user3305627

0

awk應該做的:

awk '!/^>/ {a[s]=a[s] $0} {s=$0} END {for (i in a) print i RS a[i]}' a1 a2 a3 
>2ERT 
INNWIVPDSSM 
>1BS3 
MDEKRRAQHQSKGGILS 
>3a56 
NEVERRRRDKILSKASDYIQELRQSNHR 
2

事情是這樣的:

awk '/^>/{sel=$0;next}{a[sel]=a[sel]$0}END{for (i in a) print i RS a[i]}' a[123].txt 

,說,如果第一個字符是 「>」,設置記錄選擇(我的 「SEL」 變量)到當前行,並忽略其餘的處理。如果該行不以「>」開始,則將當前行添加到當前選定的行。最後,將所有內容打印出來。

輸出示例:

>3a56 
NEVERRRRDKILSKASDYIQELRQSNHR 
>1BS3 
MDEKRRAQHQSKGGILS 
>2ERT 
INNWIVPDSSM 
+0

不知道爲什麼,我得到所有輸出在長隊,而不是在我的職位6。 – Jotne

+1

發現錯誤,你需要刪除'/^\> /'中的「\」並將其設置爲'/ ^> /' – Jotne

+0

嗯,怪怪的!不知道爲什麼會這樣,但感謝您進行測試。 –

相關問題