2 つの数値リストをソートし、uniq を使用して交点を取得します。

2 つの数値リストをソートし、uniq を使用して交点を取得します。

ファイルAとBがあるので、次のコマンドを使用しました。

(sort -n A B) | uniq -d

これにより、両方のファイルに表示される数値が提供されます。

1
2
2
3
4
5
11
11
12
31

これは私が得た数ですが、sort -n A Bパイプするとuniq -d2ではなく11だけが得られます。私は何が間違っていましたか?

答え1

あまり使っていないので、ちょうど言及します。以下に基づくソリューション:

comm -12 <(sort A) <(sort B)

これは<( ... )、プロセス置換を使用してファイルAとBをソートし、それを入力として供給し、comm次のものを使用します-12

  -1     suppress column 1 (lines unique to FILE1) 
  -2     suppress column 2 (lines unique to FILE2)

...両方のファイルに共通の行だけを残します。

答え2

コメントが示すように、問題は空白やキャリッジリターンである可能性があります。次のいずれかの方法で問題を解決できます。

$ (sort -n A B) | sed -E 's/[^[:alnum:]]+$//' | uniq -d
$ (sort -n A B) | tr -d '\r ' | uniq -d

GNU sed の一部のバージョンでは、-r拡張正規表現を使用して情報を取得します。 tr確かにもっと簡単ですが、それに続く文字があるかどうかにかかわらず、文字を削除するので、さらに残酷です。

答え3

末尾のスペースにdon_crisstiが言及したことに加えて、ファイルの種類/改行スタイルを確認することをお勧めします。 uniq のマニュアルページには次のように記載されています。

uniq - report or omit repeated lines

CRLFが予想されるLFの代わりにWindowsスタイルの改行を意味すると言うと、驚くことがあります。

以下を使用してタイプをすばやく確認できます。

file <filename>

CRLF エンドラインシーケンスを削除するには、dos2unix を介して入力ファイルを実行できます。以下は行末文字を変換します。

dos2unix A
dos2unix B

答え4

ファイルサイズに応じて、以下を使用できますgrep

grep -Fxf A B

-fパターンリストをインポートするファイルを指定します。

-x行全体が一致することを示します(行の部分一致は許可されていません)。

-Fこれは、パターンが正規表現ではなく固定文字列として扱われることを意味します。

サイズが小さい場合は、Bパターンファイル名を()で指定すると、A少し速い結果が得られます。Bgrep -Fxf B A

出力をパイプして、sort -u各ファイルに表示されるさまざまな行のソートされたリストを取得できます。

grep -Fxf A B | sort -u

もちろん、問題がキャリッジリターン行の終わりである場合は、dos2unixそれを最初に使用する必要があります。

関連情報