1

以下のようなパターンを含むファイル、たとえば入力があります。

quantum_mech_.*
astrophysics_.*
geology_.*
economy_*

私は別のファイルを持っています、例えば、件名は次のようになります:

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

入力ファイルから各行をgrepして、ファイル「subject」を検索し、最初の一致のみを出力し、その行がsubjectファイルにまったく見つからない場合は「NotMatched」も出力します。だから私は次のような出力を期待しています:

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を使用するヘルプ/ポインターは素晴らしいでしょう。

ありがとう、よろしく、

4

3 に答える 3

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のすべての値に対して機能します。

于 2012-12-06T01:27:24.807 に答える
0

使用する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
于 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 に答える