我有一个文件,比如输入,包含如下图案:
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的任何帮助/指针都会很棒。
谢谢和问候,
答案 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