仅当文件中的行与另一个文件中的模式匹配时才更改它们

仅当文件中的行与另一个文件中的模式匹配时才更改它们

假设我有这两个文件:

因普

11 hello
22 wonderful
33 beach
44 today
55 is
66 great

拍拍

11
44
55

我想在 inp 中做一些事情,但仅限于 pats 中的行。例如,我想在末尾添加+。我希望最终结果是

出去

11 hello+
22 wonderful
33 beach
44 today+
55 is+
66 great

有没有简单的方法可以用 sed、awk 等来做到这一点?简单地说,我不想编写(例如python)程序,我更喜欢一起寻找诸如grep -f pats inp+之类的东西sed 's/$/+/'

编辑:

我希望它能够与行中任何地方找到的模式一起使用,例如:

因普

11 hello
wonderful22
beach 33 front
to44day
is55
gr 66 eat

拍拍

11
44
55

出去

11 hello+
wonderful22
beach 33 front
to44day+
is55+
gr 66 eat

答案1

bash 语法:

sed -f <(printf 's/^%d\>.*/&+/\n' $(<pats)) inp

部分内部分<()打印出 sed 程序来转换相应的行:

$ printf 's/^%d\>.*/&+/\n' $(<pats)
s/^11\>.*/&+/
s/^44\>.*/&+/
s/^55\>.*/&+/

语法<()是 bash 进程替换,因此您可以获取命令的输出并像来自文件一样使用它。然后我们必须sed -f sed_program inp实际转换文件

答案2

awk 'NR==FNR {pats[$1]++; next} $1 in pats {$2=$2"+"} 1' pats inp
11 hello+
22 wonderful
33 beach
44 today+
55 is+
66 great

要检查 的每一行中的任何位置是否匹配inp,您可以使用本质上类似的方法,但使用提取部分进行比较match

awk 'NR==FNR {pats[$1]++; next} match($0,/[0-9]+/) && substr($0,RSTART,RLENGTH) in pats {$0=$0"+"} 1' pats inp2
11 hello+
wonderful22
beach 33 front
to44day+
is55+
gr 66 eat

(如果你想匹配随意的模式pats,那么将需要不同的方法,例如显式循环数组的元素pats。)

答案3

尝试这个...

awk 'NR==FNR{Arr[$0];next}{for(i=1;i<=NF;i++)for(j in Arr)if(match($i,j)){F=1;$0=$0"+"}else{F=0}}1' pat.txt input.txt
    11 hello+
    wonderful22
    beach 33 front
    to44day+
    is55+
    gr 66 eat

相关内容