おおよそこれを使用して、テキストからストップワードを削除しています code
私は以下を持っています
$ cat file
file
types
extensions
$ cat stopwords
i
file
types
grep -vwFf stopwords file
結果を期待しています:extensions
(私は間違っていると思います)
file
extensions
これは、ワードfile
がストップワードファイルでスキップされたかのようです。これがクールなビットです:最初の行の単一の単語/文字i
をf
、i
、l
、e
以外の任意のASCII文字に変更してストップワードファイルを変更すると、同じgrepコマンドで異なるextensions
の正しい結果。
ここで何が起こっているのですか、どうすれば修正できますか?
Mac OSXでgrep(BSD grep)2.5.1-FreeBSDを使用していますGNU bash、バージョン4.4.12(1)
これはbsdgrep
のバグであり、現在のスキャン対象の行の一部を追跡する変数に関連しており、複数のパターンが関係する場合に、正規表現マッチングエンジンへの連続呼び出しで上書きされます。
これをある程度回避するには、-w
オプションを使用しないでください。このオプションは、この変数に依存して正しい操作を行うために失敗しますが、代わりに、単語の先頭と末尾に一致する正規表現拡張を使用して、 stopwords
ファイルは次のようになります。
\ <i \> \<file \> \<types \>
この回避策では、-F
オプションを使用しないことも必要になります。
ドキュメント化された正規表現コンポーネント[[:<:]]
および[[:>:]]
は、re_format
マニュアルに記載されているとおり、notここでは機能しません。これは、bsdgrep
にコンパイルされる正規表現ライブラリでGNU正規表現の互換性サポートがオンになっているためです。これは別のバグであり、修正されたと報告されています。
このバグは今年初めに修正されました。この修正はまだFreeBSDのSTABLEまたはRELEASEフレーバーには含まれていませんが、現在のところ報告されています。
これをFreeBSDのgrep
から派生したMacOSバージョンのbsdgrep
に組み込むには、アップルにお問い合わせください。 ☺
このコード:
pl " Input data file data1 and stopwords file data2:"
head data1 data2
pl " Expected output:"
cat $E
pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1
pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1
生成する:
-----
Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions
==> data2 <==
i
file
types
-----
Expected output:
extensions
-----
Results, grep:
file
extensions
-----
Results, cgrep:
extensions
次のようなシステム:
OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57
Cgrepの詳細については、brewから、およびsourceforgeから入手できます。
cgrep shows context of matching patterns found in files (man)
Path : ~/executable/cgrep
Version : 8.15
Type : Mach-O64-bitexecutablex86_64 ...)
Home : http://sourceforge.net/projects/cgrep/ (doc)
乾杯、drl