从文件grep,打印匹配和不匹配

时间:2012-12-05 17:24:14

标签: unix sed grep pattern-matching csh

我有一个文件,比如输入,包含如下图案:

quantum_mech_.*
astrophysics_.*
geology_.*
economy_*

我有另一个文件,说主题,看起来像:

quantum_mech_[101]
astrophysics_[102]
geology_[203]
quantum_mech_[007]
geology_[205]

我想从输入文件中grep每一行并搜索文件“subject”并仅输出第一个匹配项,如果在主题文件中找不到该行,则还打印“Not Matched”。所以我期待输出如下:

quantum_mech_[101]
astrophysics_[102]
geology_[203]
Not Matched

我知道这是一个非常古老的问题,但这些方法似乎都不适合我。我尝试了以下代码的几种变体:

script.csh:

cat $1 | while read line
do grep $line ./subject | head -1 >> output
set VAR=$?
if ( $VAR==0 ) then 
        echo "Not Matched\n" >> output
endif
done

运行方式:

    script.csh input

使用sed / grep / csh的任何帮助/指针都会很棒。

谢谢和问候,

3 个答案:

答案 0 :(得分:1)

除了文字“Not Matched”之外,这将打印每个不匹配的RE,以便您知道哪些RE不匹配:

$ awk '
NR==FNR{ a[$0]; next }
{ for (re in a) if ($0 ~ re) { print; delete a[re] } }
END{ for (re in a) print re, "Not Matched" }
' file1 file2
quantum_mech_[101]
astrophysics_[102]
geology_[203]
economy_* Not Matched

它适用于file1中的任何RE和file2中的任何值。

答案 1 :(得分:0)

这是使用awk的一种方式:

awk -F "[.*[]" 'FNR==NR && !($1 in a) { a[$1]=$2 } FNR!=NR { print ($1 in a) ? $1 "[" a[$1] : "Not Matched" }' subjects input

结果:

quantum_mech_[101]
astrophysics_[102]
geology_[203]
Not Matched

答案 2 :(得分:0)

这在csh和bash中工作正常。

for line in `cat $1`;
do
  grep -m1 $line ./subject || echo "Not matched"
done >> output

感谢dogbane的指针,下面是更好(和正确)的方法。当行中有空格时,上面也会出现问题。

while read line 
do
  grep -m1 "$line" ./subject || echo "Not matched"
done < $1 >> output