たとえば、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 に頻繁に表示される行は、ユーザーまたはuniq
File1.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