的grep,打印匹配和不匹配的

问题描述:

我有一个文件,说输入,包含类似下面的模式:的grep,打印匹配和不匹配的

quantum_mech_.* 
astrophysics_.* 
geology_.* 
economy_* 

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

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

我想grep从输入文件的每一行,搜索文件“主题”,只输出第一个匹配,并打印“不匹配”,如果该行在主题文件根本找不到。所以,我期待像输出:

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

你在用什么外壳? 'csh'?您的while循环的'csh'语法错误。 – dogbane

+0

是的,我正在使用csh,其中我不是专家:( 请问你能改正这段代码吗? 谢谢 –

+0

不要使用csh来编写脚本Google“csh why not”。 –

这在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 
+0

是的,这工作得很好。非常感谢 ! –

+2

这是[UUOC](http://partmaps.org/era/unix/award.html)。 – dogbane

+0

即使发布更正,对于包含反斜杠或其名称包含空格的文件也会失败。总是把你的while循环写成'while IFS = read -r line'并且总是引用你的变量,即''$ 1'''而不是'$ 1'。 –

下面是使用一种方法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 
+0

在我的shell中卡住了太久(文件很大),但是我通过Viveks的回复得到了修复,感谢很多帮助 –

这将打印除了文本各不匹配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中的任何值。

+0

感谢您的回复,但它没有给出与使用Vivek代码相同的输出结果:(anywways非常感谢 –

+0

Awk是你的问题的正确解决方案当你发现自己在shell中编写一个循环时,你应该花一点时间重新考虑你在做什么,因为它通常是错误的方法如果我发布的脚本不能产生你想要的输出那么它将非常值得你花时间告诉我们输出有什么问题,所以我们可以帮助你找出你的输入文件或你使用的awk版本有什么问题NG。 –