テキストファイルを減算するUNIXのツール?


16

セミコロンで区切られた大きなテーブル形式のテキストフィールドで構成される大きなファイルがあります。ソートされています。同じテキストフィールドで構成される小さなファイルがあります。ある時点で、誰かがこのファイルを他のユーザーと連結し、ソートを行って上記の大きなファイルを作成しました。大きなファイルから小さなファイルの行を減算します(つまり、小さなファイルの各行について、一致する文字列が大きなファイルに存在する場合は、大きなファイルのその行を削除します)。

ファイルはおおよそ次のようになります

GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;

これを行う簡単な上品な方法はありますか、またはawkを使用する必要がありますか?

回答:


28

を使用できますgrep。入力として小さなファイルを指定し、一致しない行を見つけるように指示します。

grep -vxFf file.txt bigfile.txt > newbigfile.txt

使用されるオプションは次のとおりです。

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v
          is specified by POSIX.)
   -x, --line-regexp
          Select only those matches that exactly match the whole line.  
          (-x is specified by POSIX.)

素晴らしい、完璧に働いた。どうもありがとう。
エッシャー14

1
うまくいったのはクール-xですが、小さいファイルの行がメインファイルの別の行のサブストリングになった場合には、このオプションを使用した方がよかったと思われます。また、@ UlrichSchwarzの回答がより高速である可能性は十分にあります。
リチ14

18

comm あなたの友だちです:

NAME comm-2つのソートされたファイルを行ごとに比較

概要コミュニケーション[オプション] ... FILE1 FILE2

説明ソートされたファイルFILE1とFILE2を1行ずつ比較します。

   With  no  options, produce three-column output.  Column one contains lines unique to FILE1, column two contains
   lines unique to FILE2, and column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

(ソートされていることを考慮commするgrepため、おそらくパフォーマンス上の利点があります。)

例えば:

comm -1 -3 file.txt bigfile.txt > newbigfile.txt

2
ソートされたリストにgrep経由の通信を使用することの良い点。あなたのような特定のコマンドラインの例を与えた場合、これは、より良い答えをだろうcomm -1 -3 file.txt bigfile.txt > newbigfile.txt
スティーブ・ミジリー

100MB前後のファイルで上記のgrepコマンドを試してみましたが、「killed」エラーが発生したことを確認します。commで試してみましたが、正常に終了しました。
ジャンルカカ

あなたは以上の2つのファイルが必要な場合は、コマンドのリダイレクトがソートされていないファイルのために有用であるか:comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
odinho - Velmont
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.