2014-10-27 134 views
2

我有多個文件必須合併。Linux合併多個文件

這是例如兩個文件。

的1.txt

Allele Sequence 
B*07:02:01 ABCDE 
B*07:33:01 ABCD 
B*07:41 AB 

2.txt

Allele Sequence 
B*07:02:01 FGHIJ  
B*07:33:01 EFGH 
B*07:41 CD 

分隔爲標籤(\ t)的

我希望得到類似結果

B*07:02:01 ABCDEFGHIJ  
B*07:33:01 ABCDEFGH 
B*07:41 ABCD 

我試着如下所示。

awk -F"\t" ' 
    {key = $1} 
    FNR==NR {line[key]=$0; next} 
    key in line {print line[$1], $2} 
' $1 $2 > output_2.txt 

然後導致像

Allele Sequence^M Sequence^M 
B*07:02:01 ABCDE^M FGHIJ  
B*07:33:01 ABCD^M EFGH 
B*07:41 AB^M CD 

我怎樣才能使更清晰正是我想要

謝謝!

+0

您可能需要使用腳本語言如Python和Ruby或Perl更多的運氣。 – Linuxios 2014-10-27 20:24:18

+0

使用行中的''''鍵將隨機化輸出的順序。差不多就是 – Jotne 2014-10-27 20:39:44

回答

2

這可能工作:

awk 'FNR==NR {a[$1]=$2;next} FNR>1{print $0 a[$1]} ' 2.txt 1.txt 
B*07:02:01 ABCDEFGHIJ 
B*07:33:01 ABCDEFGH 
B*07:41 ABCD 

它是如何工作的:

awk ' 
FNR==NR {   # For first file only (2.txt) 
    a[$1]=$2  # Read data in to array a using $1 as key and $2 as value 
    next}   # Skip to next record 
FNR>1{    # Skip first record of second file (1.txt) 
    print $0 a[$1]} # Print complete record from 1.txt, and data from array using $1 as key 
' 2.txt 1.txt  # read the files 
+0

!但在ABCD EFGH之間有^ M標記,就像 – 2014-10-27 20:28:23

+0

B * 07:02:01 ABCD^MEFGH – 2014-10-27 20:28:39

+0

@ clear.choi隨着一些變化,應該可以知道。你不需要設置'FS',因爲它默認爲製表符和空格。 – Jotne 2014-10-27 20:32:59

0
awk -F"\t" ' 
     {gsub("\r",""); key = $1} 
     FNR==NR {line[key]=$0; next} 
     key in line {print line[$1]$2} 
    ' 1d.txt 2d.txt > x 
  • gsub將刪除 「^ M」 你有問題(這是CHR(13) = CR,因爲您的輸入文件來自使用CRLF的DOS/Windows世界,並且您正在UN * X上進行處理,UN * X僅使用LF作爲行分隔符)
  • 刪除 「」 在line[$1]$2將刪除空間
+0

老實說,我只是使用'tr'來後處理'\ r'。我覺得它會減少'awk'代碼中的混亂。 – 2014-10-27 20:50:24

+0

@ Mr.Llama當​​然。我試圖儘可能接近你理解的代碼,而不是引入額外的依賴/工具。 – 2014-10-27 21:02:10

0
join 1.txt 2.txt | awk '{print $1, $2 $3}'