1

我有一个文件,比如输入,包含如下模式:

quantum_mech_.*
astrophysics_.*
geology_.*
economy_*

我有另一个文件,比如主题,它看起来像:

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

我想从输入文件中查找每一行并搜索文件“主题”并仅输出第一个匹配项,如果在主题文件中根本找不到该行,则还打印“不匹配”。所以我期待这样的输出:

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

我知道这是一个很老的问题,但似乎没有一种方法适合我。我尝试了以下代码的几种变体:

脚本.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 的帮助/指针都会很棒。

谢谢并恭祝安康,

4

3 回答 3

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 中的任何值。

于 2012-12-06T01:27:24.807 回答
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
于 2012-12-05T23:52:31.277 回答
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
于 2012-12-06T04:22:26.773 回答