如果文件(a)和(b)中的字段1匹配,则将文件(a)的字段2打印到文件(b)的字段9
在post中删除基于第2列AWK / BASH中的最小值的两个列文件我已经要求帮助生成一个文件(一)这样的:
denovo0 90.2 denovo1 97.7 denovo10 93.8 denovo100 95.3
第二个文件(b)具有这样的结构(8列,制表符分隔):
denovo1446 1.0 0.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Rotifera; __Philodinidae; __uncultured_bdelloid_rotifer denovo3423 0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Enoplea denovo13975 0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Rotifera; __Philodinidae; __uncultured_bdelloid_rotifer denovo14362 0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Enoplea; __Qudsianematidae denovo18854 0.0 29.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Chromadorea; __Plectidae denovo19256 0.0 0.0 0.0 0.0 0.0 1.0 Eukaryota; __Opisthokonta; __Metazoa; __Arthropoda; __Hexapoda; __Collembola; __Sminthuridae; __Sminthuridae_environmental_sample denovo20076 0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Enoplea; __Qudsianematidae denovo22655 1.0 0.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Rotifera; __Philodinidae; __uncultured_bdelloid_rotifer
如果文件(a)和(b)中的字段1匹配,我想将文件(a)的字段2打印到文件(b)的字段9。
我在StackOverflow上查找了类似的解决scheme,例如https://unix.stackexchange.com/questions/140275/match-first-fields-of-two-tab-separated-files-and-print-matching-values ,但是无法采用它们。
我的AWK试图完全失败,我没有接近解决scheme。 不过,我可以在Excel中做到这一点,但只有当文件足够小时才可以这样做:
=INDEX('18S'!B$1:B$692189,(MATCH(phylotypes!A3:A174,'18S'!A$1:A$692189,0)))
我将文件(a)的第二个字段索引为所需的返回值,然后在文件(b)的第一个字段中定义查询值,并将其与文件(a)中的对应值进行匹配。“0”确保完全匹配在字段1中的“denovo”string之间。此外,“$”符号防止查询值改变时返回值的“滑动”。
如果文件较大,则Excel AWK或BASH允许的〜1 000 000行将会更好。
亲切的问候,
保罗
你可以select这个awk
:
awk 'BEGIN{FS=OFS="\t"} FNR==NR{a[$1]=$2; next} {for (i in a) if ($1 ~ i) print $0, a[i]}' fileA fileB
怎么运行的:
-
BEGIN{FS=OFS="\t"}
– 使input和输出字段分隔符为选项卡 -
FNR==NR
–fileA
执行此块 -
{a[$1]=$2; next}
{a[$1]=$2; next}
– 创build一个关键数组a
,键为$1
,值为$2
,然后跳转到下a
logging -
{...}
– 为第二个input文件执行此块 -
for (i in a)
迭代数组a
-
if ($1 ~ i)
fileB
数组中的关键部分与fileB
中的$1
匹配 -
print $0, a[i]
– 打印fileB
整个logging和数组中的值