Linux_sortコマンド

8358 ワード

見た上下2編はsortを説明して、とても実用的で、1編に変えて、原文の住所はそれぞれ:
https://www.cnblogs.com/longjshz/p/5794590.html
https://www.cnblogs.com/longjshz/p/5797933.html
1 sortの動作原理
sortはファイルの各行を1単位として比較し,比較原則は先頭文字から後ろに,ASCIIコード値を順に比較し,最後に昇順に出力する.
[zookeeper@master rh]$ cat seq.txt
banana
apple
pear
orange
pear
[zookeeper@master rh]$ sort seq.txt 
apple
banana
orange
pear
pear

2 sortの-uオプション
出力行で重複行を除去するのが簡単です.
[zookeeper@master rh]$ sort -u seq.txt 
apple
banana
orange
pear

pearは-uオプションで非情に削除された.
3 sortの-rオプション
[zookeeper@master rh]$ cat number.txt
1
3
5
7
11
2
4
6
10
8
9
[zookeeper@master rh]$ sort number.txt  --sort 
1
10
11
2
3
4
5
6
7
8
9
[zookeeper@master rh]$ sort -n number.txt      -- , 1 2, 1 , 10 2 
1
2
3
4
5
6
7
8
9
10
11
[zookeeper@master rh]$ sort -n -r number.txt      --r ,n 
11
10
9
8
7
6
5
4
3
2
1

4 sortの-oオプション
sortのデフォルトは標準出力に結果を出力するため、sort filename>newfileのような結果をファイルに書き込むにはリダイレクトが必要です.
ただし、ソート結果を元のファイルに出力したい場合は、リダイレクトではだめです.
[zookeeper@master rh]$ sort -n -r number.txt > number.txt
[zookeeper@master rh]$ cat number.txt 
[zookeeper@master rh]$ 

numberが空になりました.だから私たちは-oオプションを使用する必要があります.それはこの問題を解決することに成功して、安心して結果を元のファイルに書き込むことができます.これも-o比リダイレクトの唯一の利点かもしれません.
[zookeeper@master rh]$ sort -n -r number.txt -o number.txt
[zookeeper@master rh]$ cat number.txt 
11
10
9
8
7
6
5
4
3
2
1

5 sortの-tオプションと-kオプション
[zookeeper@master rh]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
[zookeeper@master rh]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

この書類は3列あり、列と列の間にはコロンで区切られており、1列目は果物のタイプ、2列目は果物の数、3列目は果物の価格を表しています.では、果物の数でソートしたいのですが、2列目でソートしたいのですが、sortをどのように利用して実現しますか?幸いなことに、sortは-tオプションを提供しており、後でインターバルを設定することができます.(cutとpasteの-dオプションを思い出したのか、共感~)
スペーサを指定すると、-kで列数を指定できます.スペーサとしてコロンを用い,2番目の列に対して数値昇順ソートを行い,満足のいく結果を得た.
6その他のsort共通オプション
-fは小文字を大文字に変換して比較します.つまり、大文字と小文字を無視します.
-cはファイルが順序付けされているかどうかをチェックし、順序が乱れている場合は、最初の順序付けされた行の関連情報を出力し、最後に1を返します.
-Cは、ファイルが順序付けされているかどうかをチェックします.順序が乱れている場合は、内容を出力せず、1だけ戻ります.
M-Mは月でソートされます.例えばJANがFEBより小さいなどです.
-bは、各行の前のすべての空白部分を無視し、最初の可視文字から比較します.
 
 
1素材を用意する
[root@FDMdevBI opt]# cat testsort.txt 
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

1番目のドメインは会社名、2番目のドメインは会社の人数、3番目のドメインは従業員の平均賃金です.△会社名のほかに、ほかの手紙もでたらめに書いてある.
2このファイルを会社のアルファベット順に並べ替えたいです.つまり、最初のドメインで並べ替えます.(このfacebook.txtファイルには3つのドメインがあります)
[root@FDMdevBI opt]# sort -t ' ' -k 1 testsort.txt 
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

見たでしょう、そのまま-k 1で設定すればいいです.(実はここは厳密ではありませんが、後でわかります)
3フェイスブックをtxtは会社の人数で並べ替えます
[root@FDMdevBI opt]# sort -n -t ' ' -k 2 testsort.txt 
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

しかし、ここで問題が発生しました.それはbaiduとsohuの会社の人数が同じで、100人ですが、この時はどうしますか.デフォルトのルールでは、最初のドメインから昇順ソートされるため、baiduはsohuの前に並んでいます.
4フェイスブックをtxtは会社の人数によって並べ替えられ、人数が同じのは従業員の平均賃金の昇順に並べ替えられる.
[root@FDMdevBI opt]# sort -n -t ' ' -k2 -k3 testsort.txt 
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

ほら、私たちは-k 2-k 3を追加して問題を解決しました.滴に対してsortは,ドメインソートの優先度を設定し,2番目のドメインでソートし,同じであれば3番目のドメインでソートする設定をサポートする.(よろしければ、ずっとこのように書いて、複数のソート優先度を設定することができます)
5フェイスブックをtxtは従業員の給与降順で並べ替えられ、従業員の人数が同じ場合は会社の人数昇順で並べ替えられます:(これはちょっと難しいですね)
[root@FDMdevBI opt]# sort -n -t ' ' -k3r -k2 testsort.txt 
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

ここにはいくつかの小さなテクニックが使われています.よく見てください.-k 3の後ろに小文字rをこっそり追加しました.私たちの前の文章と結びつけて、答えを得ることができますか?発表:rと-rオプションの役割は同じで、逆順を表す.sortのデフォルトは昇順で並べ替えられているため、ここではrを加えて3番目のドメイン(従業員平均賃金)が降順で並べ替えられていることを示す必要があります.ここでnを加えることもできます.このドメインをソートするときに、数値サイズでソートすることを示します.例を挙げましょう.
[root@FDMdevBI opt]# sort -t ' ' -k3rn -k2n testsort.txt 
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

ほら、一番前の-nオプションを外して、それを各-kオプションに追加しました.
6-kオプションの具体的な構文フォーマット
もっと深く進むには、理論的な知識を持たなければなりません.-kオプションの構文フォーマットを理解する必要があります.次のようにします.
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
この構文フォーマットは、その中のカンマ(",")によって、Start部分とEnd部分の2つの大部分に分けることができます.
まず、「End部分を設定しないと、Endが行末に設定されていると思う」という考えを植え付けます.この概念は重要ですが、重視しないことが多いです.
Start部分も3つの部分で構成されており、その中のModifier部分は私たちが前に言ったnとrのようなオプション部分です.スタート部分のFStartとC.スタートについて重点的にお話しします.
C.Startも省略可能であり、省略すると本ドメインの先頭部分から始まることを示す.前の例の-k 2と-k 3はC.Startを省略した例ですね.
FStart.CStartは、FStartが使用するドメインを表し、CStartはFStartドメインで何番目の文字から「ソートヘッダ」を表す.
同じように、End部分ではFEndを設定することができます.CEnd、省略すると.CEndは、「ドメインの末尾」、すなわち、このドメインの最後の文字を表す.あるいは、CEndを0(ゼロ)に設定すると、「ドメインの末尾」に終わることを示します.
7突発的な奇想は、会社の英語名の2番目のアルファベットからソートされます.
 
[root@FDMdevBI opt]# sort -t ' ' -k1.2 testsort.txt 
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
[root@FDMdevBI opt]# sort -t ' ' -k1.3 testsort.txt 
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
看,我们使用了-k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。

8 又突发奇想,,只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

[root@FDMdevBI opt]# sort -t ' ' -k1.2,1.2 -k3,3nr testsort.txt 
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

2番目のアルファベットのみをソートするため、-k 1.2,1.2の表現を使用して、2番目のアルファベットのみをソートすることを表します.(私が-k 1.2を使っているのにどうしてだめなのかと聞かれたら、もちろんだめです.End部分を省略しているので、2番目のアルファベットからドメインの最後の文字までの文字列をソートすることを意味します).従業員の給与をソートするには、-k 3,3も使用しました.これは最も正確な表現で、私たちが「本ドメインのみ」ソートしていることを示しています.後の3を省略すると、「3番目のドメインから最後のドメイン位置までの内容をソートする」ことになります.
9 modifierセクションで使用できるオプションはどれですか?
b、d、f、i、nまたはrを用いることができる.
その中でnとrはもうよく知っているに違いない.
bは、ドメインの署名空白記号を無視することを示す.
dは、ドメインを辞書順に並べ替える(すなわち、空白とアルファベットのみを考慮する)ことを表す.
fは、ドメインの大文字と小文字を無視してソートすることを示す.
iは、「印刷不可文字」を無視し、印刷可能文字のみをソートすることを示す.(一部のASCIIは印刷不可文字で、例えばaはアラームで、bは退格で、改行で、rはリターンなど)
10-kと-uの併用例について考える:
[root@FDMdevBI opt]# cat testsort.txt 
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
[root@FDMdevBI opt]# sort -n -k2 testsort.txt 
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
[root@FDMdevBI opt]# sort -n -k2 -u testsort.txt 
guge 50 3000
baidu 100 5000
google 110 5000

 
会社員ドメインで数値ソートを設定し、-uを加えるとsohu行が削除されます!元々−uは−kで設定されたドメインのみを認識し,同じことを発見すると,後続の同じ行をすべて削除する.
 
[root@FDMdevBI opt]# sort -k1 -u testsort.txt 
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
[root@FDMdevBI opt]# sort -k1.1,1.1 -u testsort.txt 
baidu 100 5000
google 110 5000
sohu 100 4500

この例も同様で,先頭文字がgのgugeであると難を免れない.
[root@FDMdevBI opt]# sort -n -k2 -k3 -u testsort.txt 
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

あれ!ここで2つの階層のソート優先度を設定した場合、-uを使用して行は削除されません.元-uはすべての-kオプションを比較して、すべて同じものを削除することができて、その中の1級の違いがあれば簡単に削除することはできません:)(信じないで、あなたは自分で1行のsina 100 4500をプラスして試してみることができます)
11最も奇妙なソート:
[root@FDMdevBI opt]# sort -n -k2.2,3.1 testsort.txt 
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

2番目のドメインの2番目の文字から3番目のドメインの1番目の文字の最後の部分まで並べ替えます.
1行目は0 3、2行目は00 5、3行目は00 4、4行目は10 5を抽出します.
またsortは0が00未満が000未満が0000未満であると考えているため...
だから0 3が一番に違いない.10 5は最後に違いない.しかし、なぜ00 5は00 4の前にあるのだろうか.△自分で実験をして考えてみてください.
答え:元の「ドメイン間設定は偽物」で、sortは2番目のドメインの2番目の文字から2番目のドメインの最後の文字の部分を比較するだけで、3番目のドメインの先頭文字を比較範囲に入れません.00と00が同時に発見されると、sortは自動的に最初のドメインを比較します.もちろんbaiduはsohuの前にあります.次の例を使用して確認します.
[root@FDMdevBI opt]# sort -n -k2.2,3.1 -k1,1r testsort.txt 
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

12 sortコマンドの後に+1-2という記号が表示されることがありますが、これは何ですか.
この文法について、最新のsortはこのように説明しています.
On older systems, `sort’ supports an obsolete origin-zero syntax `+POS1 [-POS2]‘ for specifying sort keys.  POSIX 1003.1-2001 (*note Standards conformance::) does not allow this; use `-k’ instead.
もとは、このような古い表示方式はすでに淘汰されて、后でこのような表示方法を使うシナリオを堂々と軽蔑することができます!
△古いスクリプトの存在を防ぐために、ここではこの表現方法について説明します.プラス記号はStart部分、マイナス記号はEnd部分を表します.最も重要なのは、この方法は0からカウントされ、以前に述べた最初のドメインは、ここでは0番目のドメインとして表されています.以前の2番目の文字は、ここでは1番目の文字として表されています.分かりますか.