我正在使用 grep 命令从文件中获取所需的信息。我正在使用两个 grep 语句,如下所示
XXXX='grep XXXX FILE A|sort|uniq|wc -l'
grep YYYY FILE A|uniq| > FILE B
现在该文件被遍历两次。但我只想知道,如果我能够在单个文件遍历中完成这两个步骤,即我想知道我是否可以使用类似于 egrep 的东西,我可以 grep 两个字符串和一个字符串,我将使用它存储一个变量并将另一个字符串输出到一个文件中。
您可以使用以下代码。在这里,我们只在所有文件中搜索包含 XXXX 或 YYYY 的行一次,并将结果行存储到一个数组中。然后我们使用这个数组的元素来选择包含 XXXX 的行和包含 YYYY 的行。
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:
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
这将扫描文件一次,每当看到包含适当模式的 uniq 行时递增计数器。请注意,这里没有很好地定义 YYYY 行数组上的迭代顺序,因此排序是必要的。某些版本的 awk 提供了不依赖外部实用程序对数组进行排序的能力,但并非所有版本都这样做。如果你想这样做,请使用 perl。