如何在unix中基于一个公共列合并两个.txt文件.Unix



我有两个.txt文件。File1.txt和File2.txt。如何在unix中基于一个公共列合并这两个文件(可能使用awk(。

File1.txt看起来像

Sub_ID  Sam_ID   v1              
1878372 2253734 SAMN06396112           
1883177 2264293 SAMN06414028          
1884646 2275341 SAMN06432785         
1860945 2277481 SAMN06407597  

File2.txt看起来像

Sam_ID  code    V3      V4 
2253734 20481   NA      DNA   
2275341 20483   NA      DNA    
2277481 20488   NA      DNA   

合并后的最终输出文件应该看起来像这个

Finalfile.txt
Sub_ID  Sam_ID   v1               code   V3      V4
1878372 2253734 SAMN06396112     20481   NA      DNA                
1884646 2275341 SAMN06432785     20483   NA      DNA     
1860945 2277481 SAMN06407597     20488   NA      DNA  

到目前为止,我已经尝试过Join,但可能我还没有完全理解该命令(对unix来说是新手(。

sort -k2b File1.txt >sorted_file1.txt 
sort File2.txt >sorted_file2.txt 
join -1 2 sorted_file1.txt sorted_file2.txt > Finalfile.txt

据我所知,到k2b时,我将指定File_1的第二列在两者之间通用,然后合并。

感谢您添加自己的尝试来解决问题,这使故障排除更加容易。

这个答案有点复杂,但这里有一个潜在的解决方案(GNU加入(:

join -t $'t' -1 2 -2 1 <(head -n 1 File1.txt && tail -n +2 File1.txt | sort -k2,2 ) <(head -n 1 File2.txt && tail -n +2 File2.txt | sort -k1,1)
#Sam_ID Sub_ID  v1  code    V3  V4
#2253734    1878372 SAMN06396112    20481   NA  DNA
#2275341    1884646 SAMN06432785    20483   NA  DNA
#2277481    1860945 SAMN06407597    20488   NA  DNA

说明:

  • join使用单个字符作为分隔符,因此不能使用"t",但可以使用$'t'(据我所知(
  • CCD_ 5和CCD_;对于第一个文件;以及";对于第二个文件;组合文件时
  • 在每个子进程(<()(中,按Sam_ID列对文件进行排序,但从排序中排除标题(根据UNIX排序中有没有方法忽略标题行?(

编辑

要指定输出中列的顺序(将Sub_ID放在Sam_ID之前(,可以使用-o选项,例如

join -t $'t' -1 2 -2 1 -o 1.1,1.2,1.3,2.2,2.3,2.4 <(head -n 1 File1.txt && tail -n +2 File1.txt | sort -k2,2 ) <(head -n 1 File2.txt && tail -n +2 File2.txt | sort -k1,1)
#Sub_ID Sam_ID  v1  code    V3  V4
#1878372    2253734 SAMN06396112    20481   NA  DNA
#1884646    2275341 SAMN06432785    20483   NA  DNA
#1860945    2277481 SAMN06407597    20488   NA  DNA

这个单独的awk应该用于合并任务的工作文件:

awk 'FNR==NR {map[$2] = $0; next} {print map[$1], $0}' File1.txt File2.txt | column -t
Sub_ID   Sam_ID   v1            Sam_ID   code   V3  V4
1878372  2253734  SAMN06396112  2253734  20481  NA  DNA
1884646  2275341  SAMN06432785  2275341  20483  NA  DNA
1860945  2277481  SAMN06407597  2277481  20488  NA  DNA

column -t仅用于表格输出。

PS:如果在文件1中找不到文件2的第一列,那么您将在输出中获得一个前导空格。

使用cutgreppr以及来自bash的ProcSub。

pr -mt <(grep -Fv 1883177 file1.txt) <(cut -d' ' -f2- file2.txt)

输出

Sub_ID  Sam_ID   v1                  code    V3      V4
1878372 2253734 SAMN06396112        20481   NA      DNA
1884646 2275341 SAMN06432785        20483   NA      DNA
1860945 2277481 SAMN06407597        20488   NA      DNA

paste

paste -d' ' <(grep -Fv 1883177 file1.txt) <(cut -d' ' -f2- file2.txt) | column -t > Finalfile.txt

最新更新