我想将 file1 与 file2 对齐,首先匹配每个文件中的第 3、5、7 列,并将 file1 中的行放置在 file2 上相应行的旁边
这是我必须在两者之间保持重叠的代码,但我想将 file2 附加到 file1。任何帮助表示赞赏!
awk 'NR==FNR {a[$3$5$7];next}($3$5$7 in a){print $0}'
文件1
#Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele Overlapping gene/region
NW_006532398.1 202035 C 35:0:0:0:0:0 A 0:0:29:0:0:0 C KCND2
NW_006532656.1 289646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532656.1 289656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532656.1 289666 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532656.1 289676 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532657.1 636 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532657.1 646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532657.1 656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532658.1 345 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
文件2
#Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele
HiC_scaffold_7 49526089 C 0:0:28:0:0:0 A 0:31:0:0:0:0 C
HiC_scaffold_7 49539537 C 27:0:0:0:0:0 T 0:0:0:29:0:0 C
HiC_scaffold_7 49972546 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972556 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972566 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972576 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972586 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972596 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972599 A 20:0:0:0:0:0 A 0:0:0:27:0:0 C
HiC_scaffold_7 49972646 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
文件3
#Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele
HiC_scaffold_7 49526089 C 0:0:28:0:0:0 A 0:31:0:0:0:0 C NW_006532398.1 202035 C 35:0:0:0:0:0 A 0:0:29:0:0:0 C KCND2
HiC_scaffold_7 49539537 C 27:0:0:0:0:0 T 0:0:0:29:0:0 C NW_006532656.1 289646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972546 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532656.1 289656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972556 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532656.1 289666 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972566 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532656.1 289676 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972576 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532657.1 636 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972586 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532657.1 646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972596 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532657.1 656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972599 A 20:0:0:0:0:0 A 0:0:0:27:0:0 C
HiC_scaffold_7 49972646 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532658.1 345 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
答案1
首先,编辑file2
并删除前导选项卡,否则字段 3、5、7 将不匹配。
awk -F"\t" '
NR==FNR{
a[FNR]=$3","$5","$7 # save fields 3,5,7
b[FNR]=(FNR==1 ? substr($0, 2) : $0) # save the line (remove first char on 1st line)
last=FNR # save the last line nr
next # continue with next line
}
{
printf $0 # print current line
for (i=1;i<=last;i++){
if(a[i]==$3","$5","$7){ # fields 3,5,7 match?
printf FS b[i] # append matching line
a[i]="" # clear value
break # break loop
}
}
print ""
}
' file1 file2
将字段 3,5,7 保存在数组中a
,并将当前行保存$0
在数组中b
(如果是标题,则$0
减去第一个字符)。处理 时,找到数组中第一个匹配的元素,并使用其索引追加数组行,然后清除数组元素。#
file2
a
b
a
答案2
我过去通过将egrep与sort结合起来做过类似的事情;就像是:
egrep '[A-z0-9]' file1 file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1
(排序的最后一个1,1
键是第一列,其中包含文件的名称。)当然,如果任何列需要按数值排序,例如原始文件中的第 3 列,您可以执行-k4,4g
或-k4,4gr
反转排序顺序。我不知道您需要如何在其他列中进行排序。一旦你从“sort”开始交织,你就可以继续使用 awk 的管道,并根据第一列的内容(文件名)打印条件。在我自己的计算机上,我总是避免文件名中出现空格,因为它使此类操作更容易。 “egrep”用于获取所有行,并且只是获取在行开头打印的文件名的一种方法。这样,您就可以使用“排序”中的文件名以某种方式进行交织,这样您就可以在左侧获得所需的列。还没有测试以下内容(也许是错误,也许是笨拙),但这可能是一个开始。
egrep '[A-z0-9]' $file1 $file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1 | awk -vf1="${file1}" -vf2="${file2}" 'BEGIN {last="XXX"} { if ($1==f1) { if (last != "XXX") printf("\n"); } else { if (last==f2) printf("\n blank blank blank "); } ; printf("%s %s %s",$4,$6,$8); last=$1 } END {printf("\n");} ' > output.txt
sed 的意思是删除egrep 放入的“:”,将文件名保留在单独的第一列中。如果 file2 文件名按字母顺序排在第一位,则您可能需要-1,1r
在“排序”中使用 , 。意味着 file1 位于 output.txt 文件的左侧
还假设两个文件中的所有列在存储的信息中都没有空格。 “排序”会弄乱列标题的位置,因此您需要单独处理它。