最初の列に基づいて2つのファイルを比較し、一致しないファイルを印刷します。

最初の列に基づいて2つのファイルを比較し、一致しないファイルを印刷します。

ファイル1:

test1,1
test2,2
test3

文書#2:

test2
test1
test4

希望の出力:

test4

答え1

次の目的で使用できますgrep

$ grep -vwf <(cut -d, -f1 file1) file2
test4

説明する

  • grepオプション:

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    -w, --word-regexp
          Select  only  those  lines  containing  matches  that form 
          whole words.  
    -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  
    

    したがって、結合されたgrep -vwf patternFile inputFileのは、「inputFileで完全な単語として表示されないパターンファイルの行を見つけること」を意味します。

  • <(command):これをプロセス交換といい、これをサポートするシェル(bashなど)では、デフォルトではファイルのように動作します。これにより、コマンド出力をcutgrep optionsの「ファイル」として使用できます-f

  • cut -d, -f1 file1:file1の最初のカンマ区切りフィールドのみを印刷します。

データが実際に表示されているものと同じ場合-xにのみ使用するのではなく(全体の行と一致)を使用したい場合があります。-w

  -x, --line-regexp
          Select  only  those  matches  that exactly match the whole line.

だから:

$ grep -vxf <(cut -d, -f1 file1) file2
test4

またfile1、正規表現文字(など)を含めることができる.場合は、*?のものを使用することもできます-F

  -F, --fixed-strings
          Interpret PATTERNS as fixed strings, not regular expressions.

だから:

$ grep -Fvxf <(cut -d, -f1 file1) file2
test4

答え2

使用cutgrep:

grep -F -x -v -f <(cut -d',' -f1 file1) file2

cut -d',' -f1 file1最初のフィールドを印刷file1し、grep出力をパターン入力ファイルとして使用します(オプション-f)。オプション-Fは、固定文字列と行全体を一致させ、一致を反転する-xために使用されます。-v

答え3

:~$ cat > toto
a b
c d
e f
:~$ cat > titi
a b
d e
f g
:~$ awk 'NR==FNR{c[$1]++;next};c[$1] == 0' toto titi
d e
f g

これはあなたの要件を解決するために使用できる例のリストから得られた例です。

答え4

この設定の場合

grep -ffile2 -v file1
test3

します。ただし、誤検出などの場合には追加の措置が必要な場合がありますのでご注意ください。

関連情報