假设我有这两个文件:
因普
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