Regex 使用awk搜索匹配项并重命名

Regex 使用awk搜索匹配项并重命名,regex,string,bash,awk,match,Regex,String,Bash,Awk,Match,我正在绞尽脑汁想办法解决这个问题,希望有人能帮上忙。我有两个文件。。。文件1包含一长串为某些样本序列编码的唯一字符串(单列)。File2包含许多记录和许多列,但这里的记录组织具有匹配样本序列的唯一字符串。我希望AWK在File2中搜索File1中的每个唯一字符串,并使用在File2的$1中找到的字符串重命名File1中的唯一字符串,该字符串对应于找到唯一字符串的记录 File1 id1 id2 id3 id4 id5 id6 id7 id8 id9 id10 文件2 id1,id9,id33,

我正在绞尽脑汁想办法解决这个问题,希望有人能帮上忙。我有两个文件。。。文件1包含一长串为某些样本序列编码的唯一字符串(单列)。File2包含许多记录和许多列,但这里的记录组织具有匹配样本序列的唯一字符串。我希望AWK在File2中搜索File1中的每个唯一字符串,并使用在File2的$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中有大约17000条记录,File2有大约4000条记录,有1-400个字段。感谢您的帮助

我不知道。塞德

sed 's/^\([^,]*\),\(.*\)/s;\\(\2\\);\1;/' File2 | sed 's/,/\\|/g' > temp.sed
sed -f temp.sed File1 > Desired
哦,我不知道。塞德

sed 's/^\([^,]*\),\(.*\)/s;\\(\2\\);\1;/' File2 | sed 's/,/\\|/g' > temp.sed
sed -f temp.sed File1 > Desired
哦,我不知道。塞德

sed 's/^\([^,]*\),\(.*\)/s;\\(\2\\);\1;/' File2 | sed 's/,/\\|/g' > temp.sed
sed -f temp.sed File1 > Desired
哦,我不知道。塞德

sed 's/^\([^,]*\),\(.*\)/s;\\(\2\\);\1;/' File2 | sed 's/,/\\|/g' > temp.sed
sed -f temp.sed File1 > Desired
试试这个:

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
awk'
NR==FNR{
行[$0]++;
下一个
}
{
用于(一行接一行){
num=拆分(行、FLD、/、/);
对于(i=1;i试试这个:

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
awk'
NR==FNR{
行[$0]++;
下一个
}
{
用于(一行接一行){
num=拆分(行、FLD、/、/);
对于(i=1;i试试这个:

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
awk'
NR==FNR{
行[$0]++;
下一个
}
{
用于(一行接一行){
num=拆分(行、FLD、/、/);
对于(i=1;i试试这个:

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
awk'
NR==FNR{
行[$0]++;
下一个
}
{
用于(一行接一行){
num=拆分(行、FLD、/、/);

对于(i=1;i这里有一种不同的awk方法。将以下内容放入可执行的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] }
!/usr/bin/awk-f
FNR==NR{f1[$0]=NR;out[NR]=$0;cnt=NR;next}
{
拆分($0,f2_行,“,”)
用于(f2_线中的fld){
f1_线_数=f1[f2_线[fld]]
如果(f1_行数!=“out[f1_行数]=f2_行[1]
}
}

END{for(j=1;j这里有一种不同的awk方法。将以下内容放入可执行的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] }
!/usr/bin/awk-f
FNR==NR{f1[$0]=NR;out[NR]=$0;cnt=NR;next}
{
拆分($0,f2_行,“,”)
用于(f2_线中的fld){
f1_线_数=f1[f2_线[fld]]
如果(f1_行数!=“out[f1_行数]=f2_行[1]
}
}

END{for(j=1;j这里有一种不同的awk方法。将以下内容放入可执行的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] }
!/usr/bin/awk-f
FNR==NR{f1[$0]=NR;out[NR]=$0;cnt=NR;next}
{
拆分($0,f2_行,“,”)
用于(f2_线中的fld){
f1_线_数=f1[f2_线[fld]]
如果(f1_行数!=“out[f1_行数]=f2_行[1]
}
}

END{for(j=1;j这里有一种不同的awk方法。将以下内容放入可执行的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] }
!/usr/bin/awk-f
FNR==NR{f1[$0]=NR;out[NR]=$0;cnt=NR;next}
{
拆分($0,f2_行,“,”)
用于(f2_线中的fld){
f1_线_数=f1[f2_线[fld]]
如果(f1_行数!=“out[f1_行数]=f2_行[1]
}
}

结束{for(j=1;j此代码对于我发布的示例非常有效,但当我使用实际的大文件运行时,它会不间断地打印输出。它可能打印了所有迭代,而不仅仅是文件1中替换的输出。不确定发生了什么,我不得不中断运行。请注意文件传递的顺序。将文件2放在文件1之前。此代码有效eat用于我发布的示例,但当我使用实际的大文件运行它时,它会不间断地打印输出。它可能打印了所有迭代,而不仅仅是文件1中替换的输出。不确定发生了什么,我不得不中断运行。请注意文件传递的顺序。将文件2放在文件1之前。这段代码对于我发布的示例非常有效ed,但当我使用实际的大文件运行它时,它会不间断地打印输出。它可能打印了所有迭代,而不仅仅是file1中替换的输出。不确定发生了什么,我不得不中断运行。请注意文件传递的顺序。将file2放在file1之前。这段代码对于我发布的示例非常有效,但当我使用它打印的实际大文件是不间断的输出。它可能打印了所有迭代,而不仅仅是文件1中替换的输出。不确定发生了什么,我不得不中断运行。注意文件传递的顺序。将文件2放在文件1之前。这非常有效!感谢分解。从文件2生成一个数组用于递归搜索真是天才!很高兴它能为您工作,不过我想指出的是没有发生递归。
file2
正在按顺序检查,逐行和每行中的字段都与由
file1
生成的关联数组进行比较。相比之下,@JS웃 s的答案是将
file2
放入一个数组,并逐行检查
file1
,这意味着答案不需要像我这样的
out
数组来保留
file1
的输出顺序
来自
file2
的行,但使用不同的源来执行此操作。这非常有效!感谢分解。从file2生成一个用于递归搜索的数组是天才!很高兴它对您有效,尽管我想指出,没有发生递归。
file2
正在按顺序检查,逐行检查,并在每个字段中检查字段行与由
file1
生成的关联数组进行比较웃 s的答案是将
file2
放入一个数组,并逐行检查
file1
,这意味着答案不需要像我这样的
out
数组来保留
file1
的输出顺序
来自
file2
的行,但使用不同的源来执行此操作。这非常有效!感谢分解。从file2生成一个用于递归搜索的数组是天才!很高兴它对您有效,尽管我想指出,没有发生递归。
file2
正在按顺序检查,逐行检查,并在每个字段中检查字段行与由
file1
生成的关联数组进行比较웃 s的答案是将
file2
放入一个数组,并逐行检查
file1
,这意味着答案不需要像我这样的
out
数组