我试图找到解决方案,并希望有人可以提供帮助。我有两个文件... File1包含一长串编码某些样本序列(单列)的唯一字符串。 File2包含许多记录和许多列,但这里的记录组织具有匹配样本序列的唯一字符串。我希望AWK从File2中的File1中搜索每个唯一的字符串,并使用File1的$ 1中找到的字符串重命名File1中的唯一字符串,该字符串对应于找到唯一字符串的记录。
File1中
id1
id2
id3
id4
id5
id6
id7
id8
id9
id10
文件2
id1,id9,id33,id35,id36,id37,id76
id5,id7,id8,id20,id22,id23
id6,id11,id13,id14
所需输出
id1
id2
id3
id4
id5
id6
id5
id5
id1
id10
我的实际File1在$ 1中有大约17,000条记录,而File2有大约4,000条记录,包含1-400个字段。任何帮助表示赞赏!
答案 0 :(得分:1)
Awk我不知道。 SED?
sed 's/^\([^,]*\),\(.*\)/s;\\(\2\\);\1;/' File2 | sed 's/,/\\|/g' > temp.sed
sed -f temp.sed File1 > Desired
答案 1 :(得分:1)
试试这个:
awk '
NR==FNR {
lines[$0]++;
next
}
{
for(line in lines) {
num = split(line, flds, /,/);
for(i=1; i<=num; i++) {
if(flds[i] == $1) {
print flds[1]; next
}
}
}
print $1; next
}' file2 file1
id1
id2
id3
id4
id5
id6
id5
id5
id1
id10
lines
的数组中作为键lines
数组中的每一行,我们将,
分隔为分隔符,并将值存储在flds
数组flds
数组。如果我们在数组中找到与file1中的column1匹配的值,则打印数组的第一个元素(即file2中的column1)。 答案 2 :(得分:1)
这是一种不同的方式来唤醒它。将以下内容放入可执行的awk文件中:
#!/usr/bin/awk -f
FNR==NR {f1[$0]=NR; out[NR]=$0; cnt=NR; next}
{
split($0, f2_line, ",")
for( fld in f2_line ) {
f1_line_num=f1[f2_line[fld]]
if( f1_line_num!="" ) out[f1_line_num]=f2_line[1]
}
}
END { for( j=1;j<=cnt;j++ ) print out[j] }
如果您调用可执行文件awk文件awko
,则可以像awko file1 file2
一样运行它。从问题中显示的输入中产生所需的输出。
细分:
f1
)键控,另一个用行号(out
)键入。f2_line
)f2_line
中的每个字段,请检查f1
中是否有行号并将其设置为f1_line_num
。f1_line_num
非空,请替换out
。END
处,按行号顺序打印out
。