2014-10-27 152 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}'