uniqは重複した行を表示します。

uniqは重複した行を表示します。
$ grep home american.txt | sort | uniq                                                                                            
A home and a country should leave us no more!                                                                                        
Between their loved home and the war's desolation!                                                                                 
O'er the land of the free and the home of the brave!                                                                                  
O'er the land of the free and the home of the brave!                                                                                  
O'er the land of the free and the home of the brave?     

2つの重複行が表示されるのはなぜですか?

出力は次のとおりですgrep home american.txt | cat -A

O'er the land of the free and the home of the brave?^M$
O'er the land of the free and the home of the brave!^M$
A home and a country should leave us no more! ^M$
O'er the land of the free and the home of the brave!^M$
Between their loved home and the war's desolation!^M$
O'er the land of the free and the home of the brave!$

答え1

ああ、自由の地で勇敢な人の家です!

上記の行は3回表示されます。最初の2つの項目の終わりにはキャリッジリターンがあります。 3回目にはそうではありません。次のコマンドを使用して可視化できます。

猫 - A american.txt

これは、テキストファイルの末尾に空白行がないために発生します。
私の考えでは、テキストファイルの最後に常に空白行を置くことがUnix / Linuxの世界の習慣だと思います。

テスト中に見つけた他の興味深い点は次のとおりです。

  • このコマンドはcygwinとは異なる動作をします。
  • grep home american.txt | sort| uniq -u素晴らしい作品。

答え2

疑われるようにデビッドダイそしてカス2行は実際には異なりますが、唯一の違いは見えない文字です。

ファイルはWindowsのテキストファイルです。 Windowsテキストファイルでは、行は2つの文字シーケンスCR、LF(キャリッジリターン、改行)で区切られています。 Unixテキストファイルでは、行はLF(改行、改行とも呼ばれる)文字で終わります。cat -ACR^Mと改行文字が表示され、$その後に改行文字が表示されます。

UnixユーティリティがWindowsテキストファイルを処理すると、Unixユーティリティは各行の末尾に追加のCR文字を表示します。 Unixユーティリティの場合、CRは通常の文字にすぎません。最後にCRがある行は、最後にCRがないことを除いて、同じ行とは異なります。また、Windowsでは改行シーケンスが区切り記号なので、ファイルの末尾にCR、LFはありません。ただし、Unixでは、テキストファイルが空でない限り、常にLF文字で終わります。したがって、Unixユーティリティを使用してWindowsテキストファイルを処理するときにUnixユーティリティが表示するのは、各行の最後にCRがあるファイルです(CR文字はUnix改行エンコードの一部ではないため)。行部分ではなくテキスト(末尾に改行がないため)

Unix テキストユーティリティは、最後の改行文字が不足しており、入力が有効なテキストファイルでない場合は動作が異なります。 GNUユーティリティ(組み込まれていないLinuxおよびCygwinで見つけることができます)は、これらのファイルをテキストファイルとして扱い、最終的な改行不足を維持しようとします。このsortコマンドは行を混在させ、未完了の入力行の処理中は常に出力の末尾に改行文字をエクスポートします。したがって、sortこのコマンドの内容は、CRで終わらない最後の入力行を除いて、それぞれCR文字で終わる複数行のように見えます。出力の最後の入力ラインに対応するラインを除いて、すべてのラインはCRで終わります。

uniqCRで終わる複数brave!行を確認し、そのうちの1つだけを維持します。また、CRで終わるがCRがない行も見ることができ、brave!その行は他のすべての行と異なるため、誠実にCRをエクスポートします。

端末から出力を印刷すると、CR文字はカーソルを現在の行の先頭に移動するように端末に指示し、LF文字は端末にカーソルを次の行の先頭に移動するように指示します。したがって、LFとCR、LFシーケンスは視覚的に区別できず、同じように見える2行が表示されます。このコマンドは、cat -A印刷可能な文字を追加して一意にします。

答え3

で終わる行にはbrave!キャリッジリターン(^M)があり、他の行にはありません。uniqはい、違います。

最後の行を除くファイルのすべての行にはキャリッジリターンがあります。これはMS-DOSまたはWindowsのテキストエディタ(UnixのLFまたは\ nの代わりにCR / LFを行終端として使用)で作成されたため、これらの機能があります。ファイルの最後の行にCRまたはLFはありません。それ以外の場合は、下に空白行があります。

tail -1 american.txtたとえば、改行文字なしでテキストと同じ行に次のシェルプロンプトが表示されるのは、このためです。

関連情報