天天看點

Shell指令-Sort,JoinSortJoin

Sort

sort指令以行為機關對文本進行排序。

指令文法:

sort [-b/d/f/g/i/M/n/r] [InFile]
           

參數解釋:

-b: ignore-leading-blanks,忽略前面空格符部分

-d: data-order,僅考慮空格和字母數字字元

-f: ignore-case,忽略大小寫

-g: general-numeric-sort,根據一般數值進行排序

-i: ignore-nonprinting,忽略不可列印的字元,比如換行符、回車符

-M: month-sort,以月份進行排序

-n: numeric-sort,根據字元串數值進行排序

-r: reverse,反向輸出排序結果

其他參數:

-c: check,檢查文本是否已排序,如果不是,則輸出第一個亂序的行的相關資訊,傳回1

-k N: key,以第N列進行排序

-m S1 S2: merge,合并已排序的S1、S2文本,不再排序

-o File: output,将結果寫入File中

-s: stable,通過禁用最後的比較來穩定排序

-t sep: field-separator,使用sep作為分隔符來區分列

-u: unique,去掉重複的行

-z: 零終止的結束行,0位元組,而不是換行符

-k選項解釋

-k選項的具體文法格式:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

這個文法格式可以被其中的逗号(“,”)分為兩大部分,Start部分和End部分。

先給你灌輸一個思想,那就是“如果不設定End部分,那麼就認為End被設定為行尾”。這個概念很重要的,但往往你不會重視它。

Start部分也由三部分組成,其中的Modifier部分就是我們之前說過的類似n和r的選項部分。我們重點說說Start部分的FStart和C.Start。

C.Start也是可以省略的,省略的話就表示從本域的開頭部分開始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。

FStart.CStart,其中FStart就是表示使用的域,而CStart則表示在FStart域中從第幾個字元開始算“排序首字元”。

同理,在End部分中,你可以設定FEnd.CEnd,如果你省略.CEnd,則表示結尾到“域尾”,即本域的最後一個字元。或者,如果你将CEnd設定為0(零),也是表示結尾到“域尾”。

在modifier部分還可以用到哪些選項

可以用到b、d、f、i、n 或 r。

其中n和r你肯定已經很熟悉了。

b 表示忽略本域的前導空白符号。

d 表示對本域按照字典順序排序(即,隻考慮空白和字母)。

f 表示對本域忽略大小寫進行排序。

i 表示忽略“不可列印字元”,隻針對可列印字元進行排序。(有些ASCII就是不可列印字元,比如\a是報警,\b是倒退,\n是換行,\r是回車等等)

-k和-u聯合,則 -u 隻根據k指定的域去重。

在sort指令後會看到+1 -2這些符号

表示排序從第幾個域到第幾個域,已廢棄。

Join

功能:

“将兩個檔案裡指定欄位同樣的行連接配接起來”,即依照兩個檔案裡共有的某一列,将相應的行拼接成一行。

join [options] file1 file2

注:這兩個檔案必須在已經在此列上是依照同樣的規則進行了排序。

join選項

-a FILENUM:除了顯示比對好的行另外将指定序号(1或2)檔案裡部比對的行顯示出來

-e EMPTY:将須要顯示可是檔案裡不存在的域用此選項指定的字元取代

-i :忽略大寫和小寫

-j FIELD :等同于 -1 FIELD -2 FIELD,-j指定一個域作為比對字段

-o FORMAT:以指定格式輸出

-t CHAR :以指定字元作為輸入輸出的分隔符。join 預設以空白字元做分隔符(空格和\t),能夠使用 join -t $'\t'來指定使用tab做分隔符

-v FILENUM:與-a相似 但值顯示檔案裡沒比對上的行

-1 FIELD:以file1中FIELD字段進行比對

-2 FIELD:以file2中FIELD字段進行比對

--help :列印指令幫助檔案

 join 标準輸入

有時我們須要将多個格式同樣的檔案join到一起,而join接受的是兩個檔案的指令,此時我們能夠使用管道和字元“-"來實作

join file1 file2 | join - file3 | join - file4

這樣就能夠将四個檔案 連接配接到 一起了。