我只想搜索重复出现的以给possible
定输入文件中的模式开头的字符串。
- 输入示例:
this is the best possible solution possible1234 solution!!! possible5678 solution!!! possible5678 solution!!! possible0000 solution! possible0000 solution! There should be some "possible7777" solution! There should be some "possible7777" solution!
- 期望的输出:
possible5678 solution!!! possible0000 solution! There should be some "possible7777" solution!
possibleNNNN
因为这是在文件中多次出现的 模式匹配。
答案1
这些提供了解决某些问题的可能方法对你的问题的不同修改:
<your-file grep '^possible[[:digit:]]' | sort | uniq -d
会给你一个按词法排序的以 开头的重复行列表possible<digit>
。
grep
possible
选择以 开头且后跟至少一位数字的行。sort
对结果进行排序,使重复项相邻(需要uniq
)。uniq -d
报告重复。
要匹配possible<digits>
输入中任何位置的任何出现,假设 GNU 实现grep
或兼容:
<your-file grep -Po 'possible\d+' | sort | uniq -d
在这样的输入上:
可能123我是xx可能123yy
那会给出:
possible123
对于包含重复的所有唯一行possible<digit>
:
perl -lne 'if (/possible(\d+)/) {
$count{$1}++;
$lines{$1}->{$_}++;
}
END{
for $k (grep {$count{$_} > 1} keys %count) {
print for keys %{$lines{$k}}
}
}' < your-file
在这样的输入上:
this is the best possible solution
possible1234 solution!!!
possible5678 solution!!!
possible5678 solution!!!
possible0000 solution!
impossible0000 other solution!
它给:
possible0000 solution!
impossible0000 other solution!
possible5678 solution!!!
(除了给定的行将possibleXXXX
彼此相邻之外,没有任何定义的顺序)。
答案2
对于您修改后的示例,awk
基于 - 的解决方案可以工作:
awk '/possible[[:digit:]]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt
或者,如果您awk
不理解 POSIX 字符类
awk '/possible[0-9]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt
possible
这将检查每一行是否包含后跟至少一个数字的模式。如果找到,它将增加一个发生计数器对于整条线。最后,它只会打印出现次数计数器大于 1 的那些行。
请注意,只有当您的实际输入如图所示时,这才有效。如果possibleNNNN
不同的线上可以有相同的图案,那就失败了!
答案3
我们可以使用以下方法来保留重复行的顺序。
将正则表达式存储到环境变量“re”中,然后使用 match 命令查找正则表达式行。在 thoise 行上,我们通过 gsub 命令更新了此时看到的正则表达式的计数。
$ re='\<possible[0-9]+\>' \
awk 'BEGIN { r = ENVIRON["re"] }
match($0, r) &&
(a[substr($0,RSTART,RLENGTH)] += gsub(r, "&")) == 2' logfile
Perl 中的单行代码将是:
perl -lne 'print if /\bpossible(\d+)\b/ && 2 == ($h{$1} +=()= //g)' logfile
答案4
使用 GNU awk 来表示\<
字边界、\w
简写和 match() 的第三个参数:
$ awk 'match($0,/\<possible\w*/,a) && ++cnt[a[0]]==2' file
possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!
您没有说您想要输出哪一行具有重复键,因此上面输出了第二个。