web-dev-qa-db-ja.com

最初に表示されない2つのファイルと出力行を比較するにはどうすればよいですか?

フィールドのリストを含むファイルAがある場合:

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25

そして、フィールドのリストを含む別のファイルB

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25
2017-07-02
2017-07-09
2017-07-16
2017-07-23

ファイルBに存在するnotであるファイルAのすべてのフィールドを知りたい場合、これら2つのファイルをすばやく比較するにはどうすればよいですか?

これは、ファイル間の相対的な違いを確認したい通常の差分ではなく、各行がマップのエントリであるハッシュ比較のようなものです。ファイルBに存在しないファイルAのすべての行のリストを取得して、ファイルAの各行がディレクトリを表す場所でそれらを削除できるようにします。保存されます。

Bash/CoreUtilsソリューションを探しています。

4
Zhro

ファイルがソートされている場合は、 comm を使用できます。

$ comm -13 A B
2017-07-02
2017-07-09
2017-07-16
2017-07-23

オプション付き:

  • -1:列1を抑制します(FILE1に固有の行)
  • -3:列3(両方のファイルに表示される行)を抑制します
3
Gohu

grepはこの仕事に適したツールですが、BashでもCoreUtilsからのものでもありません。

grep -Fxvf A B

これらのオプションはすべてPOSIXに準拠しています。から man 1 grep

-f pattern_file

パス名pattern_fileで指定されたファイルから1つ以上のパターンを読み取ります。 pattern_fileのパターンは、で終了します。 nullパターンは、pattern_fileの空の行で指定できます。 -Eまたは-Fオプションも指定されていない限り、POSIX.1-2008の基本定義ボリュームのセクション9.3、基本正規表現で説明されているように、各パターンはBREとして扱われます。

-F

固定文字列を使用して一致させます。指定された各パターンを正規表現ではなく文字列として扱います。入力行に連続したバイトシーケンスとしてパターンのいずれかが含まれている場合、その行は一致する必要があります。ヌル文字列はすべての行に一致します。

-v

指定したパターンのいずれにも一致しない行を選択してください。 -vオプションが指定されていない場合、選択される行は、指定されたパターンのいずれかに一致する行になります。

-x

固定文字列全体と一致するように終了を除く行のすべての文字を使用する入力行、または一致する行となる正規表現のみを考慮してください。

2

いくつかのパイプを使った別の方法

cat A B|sort|uniq -u

編集-UUOC

猫はいらない

sort A B|uniq -u
1
Paulo