使用awk搜索匹配并重命名

时间:2014-04-24 03:39:37

标签: regex string bash awk match

我试图找到解决方案,并希望有人可以提供帮助。我有两个文件... 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个字段。任何帮助表示赞赏!

3 个答案:

答案 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
  • 我们首先扫描file2并将file2中的整行存储在名为lines的数组中作为键
  • 完全存储file2后,我们将移至file1。
  • 对于lines数组中的每一行,我们将,分隔为分隔符,并将值存储在flds数组
  • 我们遍历flds数组。如果我们在数组中找到与file1中的column1匹配的值,则打印数组的第一个元素(即file2中的column1)。
  • 如果我们在扫描完所有行后找不到匹配项,我们只需按原样打印file1中的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一样运行它。从问题中显示的输入中产生所需的输出。

细分:

  • 制作两个file1数组,一个用唯一ID(f1)键控,另一个用行号(out)键入。
  • 将file2中的每一行解析为数组(f2_line
  • 对于f2_line中的每个字段,请检查f1中是否有行号并将其设置为f1_line_num
  • 如果f1_line_num非空,请替换out
  • 中的相应条目
  • END处,按行号顺序打印out