我正在使用grep命令从一个文件中获取所需的信息。我使用了两个grep语句,类似于下面的语句:
XXXX='grep XXXX FILE A|sort|uniq|wc -l'
grep YYYY FILE A|uniq| > FILE B
现在这个文件被遍历了两次。但我只想知道,是否能够在一次文件遍历中完成这两个步骤。也就是说,我想知道是否可以使用类似于egrep的东西,我可以用它来grep两个字符串,并且其中一个字符串我将用来存储到一个变量中,另一个字符串的输出则写入到一个文件中。
filtered=`grep -E '(XXXX|YYYY)' FILE A`
XXXX=`for line in ${filtered[@]}; do echo $line; done | grep XXXX | sort | uniq | wc -l`
for line in ${filtered[@]}; do echo $line; done | grep YYYY | uniq > FILE B
因此,文件不会被遍历两次!
egrep '(XXXX|YYYY)' FILE A | sort | uniq | ...
或者awk:
awk '/XXXX|YYYY/' FILE A | sort | uniq | ...
你的问题末尾有一个 '|' 符号,也许你想把 YYYY 行也传输到 sort
(或使用 sort -u
!),那么你可以简单地执行以下操作:
awk '/XXXX/ { if( !x[$0]++ ) xcount += 1 }
/YYYY/ { if( !y[$0]++ ) ycount += 1 }
END { print "XXXX:", xcount
print "YYYY:", ycount
for( i in y ) print i | "sort > FILEB"
}' FILE
这个程序在扫描文件时,每当看到一个包含适当模式的唯一行时就会增加计数器。请注意,在YYYY行数组迭代的顺序在这里没有明确定义,因此需要进行排序。某些awk版本提供了无需依赖外部实用程序即可对数组进行排序的功能,但并非所有版本都支持。如果要执行该操作,请使用perl。