在同一行中具有相同字符串的两个实例的打印行



我正在尝试打印具有 N(在本例中为 2)个图案的行。

例如:(输入文件)

cat data.txt
hello all
this is a text file
and this line is having one pattern
and this line is having two pattern, and here is another one : pattern. so its two in this line.
in this line pattern is three times , here is two more pattern and pattern

输出:(包含两个字符串的打印行 = 图案)

and this line is having two pattern, and here is another one : pattern. so its two in this line.

我试图遵循方向,但grep -c在这里没有帮助我。

string=pattern
while read line
     do
     count=$(echo $line |grep -c $string)
     #this always gives me 1, as its a count based on line. 
     if [ "$count" -eq 2 ];then
        echo $line
     fi
done <data.txt

有什么建议吗?

使用 awk

awk 'gsub(/pattern/,"&")==2' file

如果你想传入参数

awk -vPattern="pattern" -vNum=2 'gsub(Pattern,"&")==Num' file

在现有代码中,使用 gawkcount=赋值替换为以下内容:

count=$(echo $line |gawk -F "$string" -- '{print NF-1}')

$string可以容纳单词或正则表达式。 -F "$string"赋值使 gawk 拆分字段在 $string 的实例中。 因此,NF字段数将是 $string 的出现次数,加上 1 表示最后一次出现$string之后的任何内容(即使这是一个空字符串)。 因此,NF-1$string的出现次数。

示例:由于-F pattern,gawk会断线

a pattern b pattern c

分为三个领域:abc。 由于有三个字段,因此这些字段之间有两个分隔符。 因此,NF-1 ,比字段数少一个,是这些字段之间的分隔符数。

尝试:

p1=pattern
n=2
pn="$p1"
for i in $(seq 2 $n); do
  pn="$pn.*$p1"
done
pn1="$pn.*$p1"
cat data.txt | egrep "$pn" | egrep -v "$pn1" 

相关内容

  • 没有找到相关文章

最新更新