grep 查找多个字符串,但仅打印列表中每个字符串的第一个匹配项

grep 查找多个字符串,但仅打印列表中每个字符串的第一个匹配项
zgrep -f /onip/appt/app/yemi/usage_biglist.txt \
    /onip/cdr/output/nor/bac/filec/$count/nordat.gz \
    >> /onip/appt/app/yemi/have_usage.txt

概括

  1. 选择文件中的第一个字符串usage_biglist.txt
  2. 从文件中 grepnordat.gz并将结果保存到have_usage.txt
  3. 选取下一个字符串usage_biglist.txt并执行相同操作,直到第 n 个字符串

答案1

grep(或者zgrep在您的情况下)将始终输出文件中的所有匹配行。

您可以单独进行每个模式匹配,然后传递结果head -n 1

while read -r pattern; do
    zgrep "$pattern" file.gz | head -n 1
done <pattern_list.txt >output_file.txt

在你的情况下:

while read -r pattern; do
    zgrep "$pattern" /onip/cdr/output/nor/bac/filec/$count/nordat.gz | head -n 1
done </onip/appt/app/yemi/usage_biglist.txt >/onip/appt/app/yemi/have_usage.txt

答案2

我会用awk

gunzip < "/onip/cdr/output/nor/bac/filec/$count/nordat.gz" |
  awk '
    !list_processed {strings[$0]; next}
    {
      do_print = 0
      for (s in strings)
        if (index($0, s)) {
          delete strings[s]
          do_print = 1
        }
    }
    do_print
  ' /onip/appt/app/yemi/usage_biglist.txt list_processed=1 - \
    >> /onip/appt/app/yemi/have_usage.txt

答案3

使用

zgrep -m 1 -f

代替

zgrep -f

相关内容