個人的な基準に基づいて2つのファイルを比較します。

個人的な基準に基づいて2つのファイルを比較します。

たとえば、2つのテキストファイルがありますFile1.txt

A
B
C
E

そしてFile2.txt

C
D
E

文字は線を表します。

File1.txtの結果ではなく、すべての結果を探したいFile2.txt 。両方のファイルの結果が異なります。

これがどのように可能ですか?したがって、この場合はAとBを呼び出す必要があります。

答え1

ソートされている場合は、以下を試してください。

comm -23 File1.txt File2.txt

ソートされていないがソートできる場合は、bashで試してください。

comm -23 <(sort File1.txt) <(sort File2.txt)

File2.txt より File1.txt に頻繁に表示される行は、ユーザーまたはuniqFile1.txt でない場合に出力されます。sort -uこれはあなたのユースケースに適しているかもしれませんし、そうでないかもしれません。

ファイルがすでにソートされている場合は、ほとんどのシェルで単純なパイプを使用できます。たとえば、次のようになります。

sort File1.txt | comm -23 - File2.txt

答え2

単純化されました。ありがとうございます。@ジェフシャラー

努力する:

fgrep -vx -f File2.txt File1.txt

これは、File2.txtの行と一致しないFile1.txtのすべての行を見つけることです。

以前に知らなかった-xオプションを使用すると、一致するために完全な行が必要です。

-vオプションは、一致しないコンテンツを表示することを意味します。

-f オプションは、ファイルの後続の行がパターンであることを指定します。

答え3

クイックtcshスクリプト:

#  arg2linesNOTINarg1.csh:
#  tcsh
#  LINES FROM ARG2 THAT ARE NOT IN ARG1
#
if ( $#argv < 2 ) then
   echo ' set fileWITHavoidedLINES = $1 '
   echo ' set fileTOsearch = $2 '
else
   set fileWITHavoidedLINES = $1
   set fileTOsearch = $2
endif
set genSRCHstr =  'awk '"'"'BEGIN { started=0; } \
                          { if (started==0) printf("^%s$",$0);  \
                           else printf("|^%s$",$0) ; started=1 } \
     END { printf("\n") } '"'"' '"${fileWITHavoidedLINES}"' '
egrep -v `eval ${genSRCHstr}` $fileTOsearch

以下で実行できます。

tcsh arg2linesNOTINarg1.csh File2.txt  File1.txt

行が長すぎたり、スペースやタブなどの特定の文字が含まれている場合は、検索文字列の生成に問題がある可能性があります。おそらくこれらの問題を防ぐために修正されるかもしれませんが、この提案はただの始まりに過ぎません。

答え4

アッ

awk 'NR==FNR{a[$1];next}!($1 in a){print $1}' file2.txt file1.txt

出力

A
B

関連情報