大きなテーブル形式のセミコロンで区切られたテキストフィールドで構成される大きなファイルがあります。すでにソートされています。同じテキストフィールドで構成される小さなファイルがあります。ある時点で、誰かがこのファイルを他のファイルと関連付けてからソートして、前述の大容量ファイルを形成しました。大きなファイルから小さなファイルの行を減らしたいです。つまり、小さなファイルの各行に対して、一致する文字列が大きなファイルにある場合は、大きなファイルからその行を削除します。
ファイルはおおよそ次のようになります。
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を使うべきですか?
答え1
あなたはそれを使用することができます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.)
答え2
comm
あなたの友人です:
NAME comm - 2つのソートされたファイルを1行ずつ比較します。
要約通信[オプション]...ファイル1ファイル2
説明ソートされたファイル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