如何使用awk将文件列中的子字符串替换为另一个文件中的字符串?

Bin*_*Bin 1 awk

我有两个文件,并且想要使用awk将文件一列中的subtring替换为另一文件中的字符串

f1:
1a1 aaa 777
3_3 ccc 6b6
3.3 ddd 666

f2:
b5g9aaa8y
5_6ccc9.

output:
1a1 b5g9aaa8y 777
3_3 5_6ccc9. 6b6
Run Code Online (Sandbox Code Playgroud)

我想我可以在两个步骤中做到这一点:

  1. 生成子字符串和字符串的交集字典文件
  2. 使用awk(sub)完成它

但是,是否有一行awk命令来检查子字符串是否在字符串中,然后进行替换?

抱歉,我应该更清楚地解释它。

  1. file2中的字符串格式和长度不固定。
  2. file1和file2没有相同数量的记录。file2是file1的子集,只需要在file2中输出字符串
  3. 假设没有多个匹配

Rav*_*h13 5

EDIT2:由于OP现在已经更改了样本并添加了完整条件,因此请添加此解决方案。

awk 'FNR==NR{a[$2]=$1;b[$2]=$3;next} {for(i in a){if(index($0,i)){print a[i],$0,b[i];delete a[i];break}}}'  Input_file1   Input_file2
Run Code Online (Sandbox Code Playgroud)

或现在添加非单一班轮形式的解决方案。

awk '
FNR==NR{
  a[$2]=$1
  b[$2]=$3
  next
}
{
  for(i in a){
    if(index($0,i)){
      print a[i],$0,b[i]
      delete a[i]
      break;
    }
  }
}'  Input_file1  Input_file2
Run Code Online (Sandbox Code Playgroud)

编辑:根据@sjsam的情况下的注释substr可能会有所不同,然后根据提供的示例,也可以尝试遵循以下示例。它认为您只希望使用字母作为索引,并从Input_file2行中删除所有内容(OP也在注释中确认了该行)。

awk 'FNR==NR{val=$0;gsub(/[^[a-zA-Z]]*/,"");a[$0]=val;next} {$2=$2 in a?a[$2]:$2} 1'  Input_file2   Input_file1
Run Code Online (Sandbox Code Playgroud)

您可以尝试以下吗?

awk 'FNR==NR{a[substr($0,3,3)]=$0;next} {$2=$2 in a?a[$2]:$2} 1' Input_file2   Input_file1
Run Code Online (Sandbox Code Playgroud)

输出如下。

111 33aaa8 777
333 56ccc9 666
Run Code Online (Sandbox Code Playgroud)

  • 赞成。我来这是为了发表您的第二次编辑,但您击败了我:D (2认同)
  • 请记住,使用`delete a [i]`,`a`对于每次匹配都会变得越来越小,这会使搜索过程更快。我什至会在其后添加一个“ break”。如果输入只是小文件,虽然不会有太大的不同 (2认同)