3

我正在使用 grep 命令从文件中获取所需的信息。我正在使用两个 grep 语句,如下所示

XXXX='grep XXXX FILE A|sort|uniq|wc -l'
grep YYYY FILE A|uniq| > FILE B

现在该文件被遍历两次。但我只想知道,如果我能够在单个文件遍历中完成这两个步骤,即我想知道我是否可以使用类似于 egrep 的东西,我可以 grep 两个字符串和一个字符串,我将使用它存储一个变量并将另一个字符串输出到一个文件中。

4

3 回答 3

1

您可以使用以下代码。在这里,我们只在所有文件中搜索包含 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

所以文件不会被遍历两次!

于 2012-07-10T22:17:31.993 回答
0

或者使用带有析取的 egrep:

egrep '(XXXX|YYYY)' FILE A | sort | uniq | ...

或 awk:

awk '/XXXX|YYYY/' FILE A | sort | uniq | ...
于 2012-07-10T21:25:02.187 回答
0

有一个尾随'|' 您的问题中的符号,也许您打算将 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。

于 2012-07-11T13:39:42.557 回答