我有两个文件,并且想要使用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
我想我可以在两个步骤中做到这一点:
但是,有没有一行awk命令来检查子字符串是否在字符串中然后进行替换?
#对不起,我应该更清楚地解释它。
答案 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