2012-12-05 57 views
1

我有一個文件,說輸入,包含類似下面的模式:的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」。 –

回答

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

是的,這工作得很好。非常感謝 ! –

+2

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

+0

即使發佈更正,對於包含反斜槓或其名稱包含空格的文件也會失敗。總是把你的while循環寫成'while IFS = read -r line'並且總是引用你的變量,即''$ 1'''而不是'$ 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 
+0

在我的shell中卡住了太久(文件很大),但是我通過Viveks的回覆得到了修復,感謝很多幫助 –

1

這將打印除了文本各不匹配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。 –