我有两个.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的第一列,那么您将在输出中获得一个前导空格。
使用cut
grep
和pr
以及来自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