sort 是將文件的每一行作為一個(gè)單位,相互比較,比較原則是從首字符向后,依次按照ASCII碼值進(jìn)行比較,默認(rèn)將他們按照升序輸出
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、上蔡網(wǎng)絡(luò)推廣、重慶小程序開發(fā)公司、上蔡網(wǎng)絡(luò)營銷、上蔡企業(yè)策劃、上蔡品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供上蔡建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
降序
在輸出中去重
將排序結(jié)果輸出到原文件
sort的默認(rèn)輸出是輸出到標(biāo)準(zhǔn)輸出,如果想把結(jié)果輸出到文件,需要 sort file newfile,但是如果想把結(jié)果輸出到原文件這樣就不行了,這時(shí)就需要 使用sort -o
以數(shù)值來排序
sort 默認(rèn)是按照字符串排序的,這樣就會出現(xiàn)10比3小的情況,sort -n 就可以告訴sort 以整數(shù)排序
-t 后面跟 分隔符
-k 后面跟數(shù)字,表示用第幾列排序
如 sort -t : -k 2 表示把每行 以:號分割,按照第二列排序
banana:30:5.5
orange:20:3.4
apple:10:2.5
我們可以看到,當(dāng)baidu 和soho都是100的時(shí)候,baidu排在前面,當(dāng)當(dāng)前域按照默認(rèn)規(guī)矩,是從第一個(gè)域開始進(jìn)行升序排序,因此baidu排在了sohu前面。
sort 支持 -k 2 -k3這種模式,如果你需要,你可以繼續(xù)這么寫下去
你仔細(xì)看看,在-k 3后面偷偷加上了一個(gè)小寫字母r,r和-r的作用是一樣,你也可以把前面的-n去掉 在r后面加上n,如下
其實(shí)-k 選項(xiàng) 功能很強(qiáng)大,語法[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
從逗號前后 分為兩大部分,即-k 2,2,是嚴(yán)格使用第一個(gè)域排序,如果只設(shè)置-k 2 其實(shí)是按照從第一個(gè)域到行尾。逗號分開的每部分又有一個(gè)點(diǎn)表示子域,即-k 1.2表示 按照第一個(gè)域的第二個(gè)字符排序,Modifiers就是我們用到的n和r 如 -k 1.2nr 具體我們看下面的例子。
我們使用了-k 1.2,這就表示對第一個(gè)域的第二個(gè)字符開始到本域的最后一個(gè)字符為止的字符串進(jìn)行排序。你會發(fā)現(xiàn)baidu因?yàn)榈诙€(gè)字母是a而名列榜首。sohu和 google第二個(gè)字符都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。這和之前說到的按照默認(rèn)的排序規(guī)則 是不同的,當(dāng)?shù)谝粋€(gè)域的第二個(gè)字符相同時(shí),他不會去按照第一個(gè)字符排序,而是按照后面的字符排序,這是因?yàn)?k 1.2是對第一個(gè)域的第二個(gè)字符開始到本域的最后一個(gè)字符為止的字符串進(jìn)行排序。而之前的夸域其實(shí)是一種假象。
-u只識別用-k設(shè)定的域,發(fā)現(xiàn)相同,就將后續(xù)相同的行都刪除
但是這時(shí)候,卻一行也沒有刪除。原來-u是會權(quán)衡所有-k選項(xiàng),將都相同的才會刪除,只要其中有一級不同都不會輕易刪除的
可以用到b、d、f、i、n 或 r。
其中n和r你肯定已經(jīng)很熟悉了。
b表示忽略本域的簽到空白符號。
d表示對本域按照字典順序排序(即,只考慮空白和字母)。
f表示對本域忽略大小寫進(jìn)行排序。
i表示忽略“不可打印字符”,只針對可打印字符進(jìn)行排序。(有些ASCII就是不可打印字符,比如\a是報(bào)警,\b是退格,\n是換行,\r是回車等等)
該命令的功能為逐行比較兩個(gè)文本文件,列出其不同之處。它比comm命令完成更復(fù)雜的檢查。它對給出的文件進(jìn)行系統(tǒng)的檢查,并顯示出兩個(gè)文件中所有不同的行,不要求事先對文件進(jìn)行排序。
語法:diff [選項(xiàng)] file1 file2
說明:該命令告訴用戶,為了使兩個(gè)文件file1和file2一致,需要修改它們的哪些行。如果用“- ”表示file1或fiie2,則表示標(biāo)準(zhǔn)輸入。如果file1或file2是目錄,那么diff將使用該目錄中的同名文件進(jìn)行比較。
例如: diff /usr/xu mine
把目錄/usr/xu 中名為mine的文件與當(dāng)前目錄中的mine文件進(jìn)行比較。
通常輸出由下述形式的行組成:
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4 這些行類似ed命令把filel轉(zhuǎn)換成file2。字母(a、d和c)之前的行號(n1,n2)是針對file1的,其后面的行號(n3,n4)是針對file2的。字母a、d和c分別表示附加、刪除和修改操作。
在上述形式的每一行的后面跟隨受到影響的若干行,以“”打頭的行屬于第一個(gè)文件,以“”打頭的行屬于第二個(gè)文件。
diff能區(qū)別塊和字符設(shè)備文件以及FIFO(管道文件),不會把它們與普通文件進(jìn)行比較。
如果file1和file2都是目錄,則diff會產(chǎn)生很多信息。
如果一個(gè)目錄中只有一個(gè)文件,則產(chǎn)生一條信息,指出該目錄路徑名和其中的文件名。
diff各選項(xiàng)的含義如下:
- b 忽略行尾的空格,而字符串中的一個(gè)或多個(gè)空格符都視為相等。
如How are you與How are you被視為相同的字符串。
- c 采用上下文輸出格式(提供三行上下文)。
- C n 采用上下文輸出格式(提供n行上下文)。
- e 產(chǎn)生一個(gè)合法的ed腳本作為輸出。
- r 當(dāng)file1和file2是目錄時(shí),遞歸作用到各文件和目錄上。
例如,文件ml.c的內(nèi)容為(左邊行號是有意加上的,以便前后對照):
1 main( )
{
printf(“Hello!\n”);
}
5 文件m2.c的內(nèi)容為:
1 main()
2 {
3 int n , m ;
4 n= 10 ;
5 printf ( “ % d \\\\ n ” , m = n * 10);
6 }
輸入命令:
$ diff m1.c m2.c
屏幕上顯示:
3,5 c 3,6
printf(“Hello!\n”);
}
5
3
int n,m;
4 n=10 ;
5 printf ( “ % d \\\\ n ” , m = n * 10);
6 }
表示把文件m1.c的3至5行改成m2.c的3至6行后,兩個(gè)文件相同。
我感覺你這個(gè)要求太特殊了。因?yàn)閾?jù)我所知linux中的關(guān)于文件比較的命令沒有提供給你這么多功能。
你可以這么一步步的來。
寫一個(gè)shell腳本
假設(shè)兩個(gè)文件1.txt 2.txt
第一條命令
$diff -urN 1.txt 2.txt diff.patch
生成出來的diff.patch就是兩個(gè)文件中不同的記錄。
你如果需要加上你后面的“希望比較除了這行的其他內(nèi)容......”等等要求的話,用其它要求做處理就行了。
附帶,你可以先grep出帶@的行,計(jì)算出在哪兒改的,改了哪幾個(gè)字符
至于空格和制表符,我想sed就能完成了。
功能說明:比較兩個(gè)文件是否有差異。
語法:cmp [-clsv][-i 字符數(shù)目][--help][第一個(gè)文件][第二個(gè)文件]
補(bǔ)充說明:當(dāng)相互比較的兩個(gè)文件完全一樣時(shí),則該指令不會顯示任何信息。若發(fā)現(xiàn)有所差異,預(yù)設(shè)會標(biāo)示出第一個(gè)不同之處的字符和列數(shù)編號。若不指定任何文件名稱或是所給予的文件名為”-”,則cmp指令會從標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù)。
參數(shù):
-c或–print-chars 除了標(biāo)明差異處的十進(jìn)制字碼之外,一并顯示該字符所對應(yīng)字符。
-i字符數(shù)目或–ignore-initial=字符數(shù)目 指定一個(gè)數(shù)目。
-l或–verbose 標(biāo)示出所有不一樣的地方。
-s或–quiet或–silent 不顯示錯(cuò)誤信息。
-v或–version 顯示版本信息。
–help 在線幫助。
實(shí)例:
1. 要確定兩個(gè)文件是否相同,請輸入:
cmp prog.o.bak prog.o
這比較 prog.o.bak 和 prog.o。如果文件相同,則不顯示消息。如果文件不同,則顯示第一個(gè)不同的位置;例如:
prog.o.bak prog.o differ: char 4, line 1
如果顯示消息 cmp: EOF on prog.o.bak,則 prog.o 的第一部分與 prog.o.bak 相同,但在 prog.o 中還有其他數(shù)據(jù)。
2. 要顯示不同字節(jié)的每個(gè)對,請輸入:
cmp -l prog.o.bak prog.o
這比較文件,然后顯示字節(jié)數(shù)(使用十進(jìn)制格式)和每個(gè)不同的不同字節(jié)(使用八進(jìn)制格式)。例如,如果第五個(gè)字節(jié)在 prog.o.bak 中是八進(jìn)制 101,在 prog.o 中是 141,則 cmp