我有这两个文件:
file1.txt
0 rs3094315 0 0 C T
0 rs12562034 0 0 A G
0 rs3934834 0 0 C T
file2.txt
Chr,Pos,snp_name
1, 742429,rs3094315
其中 file1 的第一列也是 Chr 列,必须替换为 file2 chr 列。但是,它必须与 snp 匹配,如下所示:
file3
1 rs3094315 0 0 C T
File2 具有不同的行号和列号。
答案1
已经在这里部分回答了—— https://stackoverflow.com/questions/24516141/awk-processing-2-files-with- different-field-separators
awk 'NR==FNR {arr[$2]=$2FS$3FS$4FS$5FS$6; next} {print $1,arr[$3]}' file1 FS="," file2
1 rs3094315 0 0 C T
答案2
使用join
能够理解进程替换的 shell:
$ join -t ' ' -1 2 -2 3 -o2.1,0,1.3,1.4,1.5,1.6 <( sort -k2 file1 ) <( tr ',' ' ' <file2 | sort -k3 )
1 rs3094315 0 0 C T
第二个文件file2
存在问题,因为它使用与第一个文件 不同的字段分隔符file1
。通过运行其内容tr
以将所有逗号替换为空格可以解决此问题。
然后,这两个文件将根据我们要加入数据的字段进行排序;第一个文件中的字段 2 和第二个文件中的字段 3。
然后,系统join
将读取这两个数据集,并将它们连接到指定的空格分隔字段上。
输出字段由-o
标志确定,我们选择第二个文件的第一个字段(连接字段),然后选择第一个文件中的字段 3 到 6。