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

时间:2019-04-29 02:50:07

标签: 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

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

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

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

对不起,我应该更清楚地解释它。

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

1 个答案:

答案 0 :(得分:4)

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

或立即添加一种非衬里形式的解决方案。

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


编辑: 根据@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


请您尝试以下。

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

输出如下。

111 33aaa8 777
333 56ccc9 666