2

誰かが助けてくれることを願っています。

私は2つのファイルを持っています。 file-aのように見える

    bank
    sofa
    table

file-b「スクリプト」です。たとえば、次のようになります。

    abcdfg bank
    kitchen abcdfg
    uhuh sofa :=

file-aの単語と一致しない単語のみを知り、これをに出力する必要がありfile-bますfile-c

これを 1 つのファイルで行う必要があることはわかっていますが、これを別のファイルと比較する方法はわかりません。

私はあなたの助けに感謝します。

4

5 に答える 5

1

これはコードゴルフには勝てませんが、データのパスは 1 回だけで、並べ替えに CPU 時間を無駄にすることはありません。

awk '{ for( i=1; i<=NF; i++ ) if( NR==FNR ) w[$i]=1; else delete w[$i] }
     END{ for( i in w ) print i}' file-a file-b > file-c

スピードアップがかなりのものであることに注意してください。file-afile-basの両方を使用すると/usr/share/dict/words、この awk ソリューションは私のシステムで 1.578 秒で実行されました。John Lawrence の fgrep ソリューションの時間: 9.157 秒。Zsolt の fgrep | 一意: 4.951。

于 2012-06-05T15:47:54.300 に答える
1

2 つのステップで:

fgrep -f file-a -o file-b > this_words_from_file-a_are_in_file-b
sort file-a this_words_from_file-a_are_in_file-b | uniq -u 

(最初の単語の検索では、見つかった単語のみが出力され、次にそれらsortuniqフィルター処理して除外されます。)

于 2012-06-05T13:13:39.907 に答える
1
fgrep -of file-a file-b | fgrep -vf - file-a

最初に file-b にある file-a のすべての単語を検索し、次に fgrep を再度使用して、そのリストにない単語を file-a から取得します。

于 2012-06-05T14:19:04.667 に答える
0
> fileC; cat fileA | while read ZWORD ; do fgrep -q "$ZWORD" fileB || echo $ZWORD >>fileC; done
$ cat fileC
table

手がかり:

  • > fileC空のファイルを作成します
  • readの行を読み取り、fileAそれを変数に入れますZWORD
  • fgrep$ZWORD正規表現として評価しない
  • -q静かです
  • ||前のコマンドが失敗したときに実行
于 2012-06-05T13:21:36.693 に答える
0
join -1 1 -2 2 -v 1 <(sort file-a) <(sort -k2,2 file-b) > file-c
于 2012-06-05T13:14:20.247 に答える