ubuntu之shell編程學習筆記5——基本文本處理

排序文本sort 命令
用途:排序文件、對已排序的文件進行合併,並檢查文件以確定它們是否已排序。
語法:
sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Directory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ + [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] ] ... [ -k KeyDefinition ] ... [ File ... ]
描述:
sort 命令對 File 參數指定的文件中的行排序,並將結果寫到標準輸出。如果 File 參數指定多個文件,那麼 sort 命令將這些文件連接起來,並當作一個文件進行排序。-(減號)代替文件名指定標準輸入。如果您不指定任何文件名,那麼該命令對標準輸入排序。可以使用 -o 標誌指定輸出文件。
如果不指定任何標誌,sort 命令基於當前語言環境的整理順序對輸入文件的所有行排序。
排序關鍵字
參數描述:

-A 使用 ASCII 整理順序代替當前語言環境的整理順序在逐字節的基礎上排序。
-b 忽略前導空格和製表符,找出字段的第一或最後列。
-c 檢查輸入是否已按照標誌中指定的排序規則進行排序。如果輸入文件排序不正確,就返回一個非零值。
-d 使用字典順序排序。比較中僅考慮字母、數字和空格。
-f 比較前將所有小寫字母改成大寫字母。
-i 比較中忽略所有非打印字符。
-k KeyDefinition 指定排序關鍵字。KeyDefinition 選項的格式爲:

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

排序關鍵字包括所有以 FStart 變量指定的字段和 CStart 變量指定的列開頭的字符及以 FEnd 變量指定的字段和 CEnd 變量指定的列結束的字符。Modifier 變量的值可以是 bdfinr。 修飾符與同一字母的標誌等價。

-m 只合並多個輸入文件;假設輸入文件已經排序。
-n 按算術值對數字字段排序。數字字段可包含前導空格、可選減號、十進制數字、千分位分隔符和可選基數符。對包含任何非數字字符的字段進行數字排序會出現無法預知的結果。
-o OutFile 將輸出指向 OutFile 參數指定的文件,而不是標準輸出。OutFile 參數值可以與File 參數值相同。
-r 顛倒指定排序的順序。
-t Character 指定 Character 爲單一的字段分隔符。
-u 禁止按照排序關鍵字和選項的所有等同排序(每一組行中一行除外)。
-T Directory 將創建的所有臨時文件放入 Directory 參數指定的目錄中。
-y[Kilobytes] Kilobytes 參數指定的主存儲的千字節數啓動 sort 命令,並根據需要增加存儲量。(如果Kilobytes 參數指定的值小於最小存儲站點或大於最大存儲站點,就以這個最小存儲站點或最大存儲站點取代)。如果省略-y 標誌,sort 命令以缺省的存儲大小啓動。-y0 標誌用最小存儲啓動,而-y 標誌(不帶Kilobytes 值)用最大存儲啓動。sort 命令使用的存儲量顯著地影響性能。以大存儲量對小文件排序將很浪費。
-z RecordSize 如果正在排序的任一行大於缺省的緩衝區大小,要防止出現異常終止。指定 -c -m 標誌時,省略排序階段,使用系統的缺省緩衝大小。如果已排序行超出這一大小,排序異常終止。-z 選項指定排序階段最長行的記錄,因而可在合併階段分配足夠的緩衝區。RecordSize 必須指明等於或大於要合併的最長行的字節值。

 

例子:# sort -t : -k 3 /etc/passwd       根據/etc/passwd文件中的第三列來將passwd文件進行排序後輸出

-d會忽略%

  1. 要在 LC_ALLLC_COLLATELANG 環境變量設置爲En_US 的情況下排序fruits 文件,請輸入:

    LANG=En_US sort fruits

    此命令序列顯示以升序詞典順序排序的 fruits 文件的內容。每一列的字符,包括空格、數字和特殊字符都經一一比較。例如,如果fruits 文件包含文本:

    banana
    orange
    Persimmon
    apple
    %%banana
    apple
    ORANGE

    sort 命令顯示:

    %%banana
    ORANGE
    Persimmon
    apple
    apple
    banana
    orange

    在 ASCII 整理序列中,%(百分號)在大寫字母前,大寫字母在小寫字母前。如果您當前的語言環境指定 ASCII 之外的字符集,結果可能不同。

  2. 要以字典順序排序,請輸入:
    sort  -d fruits
    此命令序列排序和顯示 fruits 文件的內容,並且只比較字母、數字和空格。如果 fruits 文件與示例 1 相同,那麼 sort 命令顯示:

    ORANGE
    Persimmon
    apple
    apple
    %%banana
    banana
    orange

    -d 標誌忽略 %(百分號)字符,因爲它不是個字母、數字或空格。(即%%bananabanana 取代)。

  3. 要將包含大寫字母和具有類似小寫行的特殊字符行分組,請輸入:
    sort -d -ffruits
    -d 標誌忽略特殊字符,-f 標誌忽略大小寫差異。將 LC_ALLLC_COLLATELANG 環境變量設置爲C 的情況下,fruits 文件的輸出結果變爲:

    apple
    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  4. 要除去重複行排序,請輸入:
    sort  -d  -f  -u fruits
    -u 標誌告訴 sort 命令除去重複的行,使文件中的每一行唯一。此命令序列顯示:

    apple
    %%banana
    orange
    Persimmon

    不僅除去重複的 apple,而且也除去了 bananaORANGE。除去這些是因爲-d 標誌忽略%% 這個特殊字符,-f 標誌忽略大小寫差異。

  5. 要如例 4 那樣排序,除去重複的實例(除非是大寫字母或標點不同),請輸入:
    sort  -u +0  -d-f+0 fruits
    輸入 +0 -d -f 完成的排序與示例 3 中 -d -f 的排序類型相同,+0 進行另一項比較以區分不一樣的行。這防止-u 標誌將它們除去。

    示例 1 所示的 fruits 文件中,添加的 +0%%bananabananaORANGEorange 區分開來。然而,apple 的兩個實例是相同的,所以其中之一被刪除。

    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  6. 要指定分隔字段的字符,請輸入:
    sort  -t: +1 vegetables
    此命令序列排序 vegetables 文件,對每一行上第一個冒號後的文本進行比較。+1 告訴 sort 命令忽略第一字段,從第二字段的開始到該行的結束進行比較。-t: 標誌告訴 sort 命令冒號分隔字段。如果vegetables 包含:

    yams:104
    turnips:8
    potatoes:15
    carrots:104
    green beans:32
    radishes:5
    lettuce:15

    那麼,將 LC_ALLLC_COLLATELANG 環境變量設置爲 C 的情況下,sort 命令將顯示:

    carrots:104
    yams:104
    lettuce:15
    potatoes:15
    green beans:32
    radishes:5
    turnips:8

    注意數字沒有按照數字排序。當用字典式分類從左至右比較每一個字符時出現這種情況。換句話說,35 之前,所以325 之前。

  7. 要排序數字,請輸入:
    sort  -t: +1  -nvegetables
    此命令序列按照第二個字段對 vegetables 文件進行數字排序。如果 vegetables 文件與示例 6 中的相同,那麼sort 命令將顯示:

    radishes:5
    turnips:8
    lettuce:15
    potatoes:15
    green beans:32
    carrots:104
    yams:104
  8. 要對多個字段排序,請輸入:
    sort  -t: +1 -2  -n+0 -1  -rvegetables
    sort  -t:  -k2,2n-k1,1 r vegetables
    此命令序列對第二字段(+1 -2 -n)進行數字排序。在這個順序中,它以逆字母順序(+0 -1 -r)對第一字段排序。將 LC_ALLLC_COLLATELANG 環境變量設置爲 C 的情況下,輸出將類似於:

    radishes:5
    turnips:8
    potatoes:15
    lettuce:15
    green beans:32
    yams:104
    carrots:104

    此命令按數字順序對行排序。當兩行數字相同時,它們以逆字母順序出現。

  9. 要使用排序的文本替換原始文件,請輸入:
    sort  -o vegetables vegetables
    此命令序列將排序輸出存入 vegetables 文件( -o vegetables)。

uniq命令-----文本除重

文件經過處理後在它的輸出文件中可能會出現重複的行。例如,使用cat命令將兩個文件合併後,再使用sort命令進行排序,就可能出現重複行。這時可以使用uniq命令將這些重複行從輸出文件中刪除,只留下每條記錄的唯一樣本。

語法:
uniq [選項] 文件
說明:這個命令讀取輸入文件,並比較相鄰的行。在正常情況下,第二個及以後更多個重複行將被刪去,行比較是根據所用字符集的排序序列進行的。該命令加工後的結果寫到輸出文件中。輸入文件和輸出文件必須不同。如果輸入文件用“- ”表示,則從標準輸入讀取。

 -c或--count   在每列旁邊顯示該行重複出現的次數。
  -d或--repeated   僅顯示重複出現的行列。
  -f<欄位>或--skip-fields=<欄位>   忽略比較指定的欄位。
  -s<字符位置>或--skip-chars=<字符位置>   忽略比較指定的字符。
  -u或--unique   僅顯示出一次的行列。
  -w<字符位置>或--check-chars=<字符位置>   指定要比較的字符。
  --help   顯示幫助。
  --version   顯示版本信息。
例子:

 [root@stu100 ~]# cat test

  boy took bat home

  boy took bat home

  girl took bat home

  dog brought hat home

  dog brought hat home

  dog brought hat home

  看test文件的內容,可以看到其中的連續重複行

  [root@stu100 ~]# uniq test

  boy took bat home

  girl took bat home

  dog brought hat home

  uniq命令不加任何參數,僅顯示連續重複的行一次

  [root@stu100 ~]# uniq -c test

  2 boy took bat home

  1 girl took bat home

  3 dog brought hat home

  -c 參數顯示文件中每行連續出現的次數。

  [root@stu100 ~]# uniq -d test

  boy took bat home

  dog brought hat home

  -d選項僅顯示文件中連續重複出現的行。

  [root@stu100 ~]# uniq -u test

  girl took bat home

  -u選項顯示文件中沒有連續出現的行。

  [root@stu100 ~]# uniq -f 2 -s 2 test

  boy took bat home

  忽略每行的前2個字段,忽略第二個空白字符和第三個字段的首字符,結果at home

  [root@stu100 ~]# uniq -f 1 test

  boy took bat home

  dog brought hat home

  忽略每行的第一個字段,這樣boy ,girl開頭的行看起來是連續重複的行

文件的打印和格式化輸出

文件打印---pr命令

pr是一個標準的輸出工具,可以直接輸出到打印機,如果你希望將結果保存在文件中,則需要重定向它的輸出,如下面這個例子:
  $ pr file.txt file.output
可以用來控制文本輸出效果的參數很多,一般來說,每頁的標題就是這個文檔的文件名。當然,用戶也可以自行定義標題,比如:
  $ pr -h "My report" file.txt


使用fmt命令格式化文本

語  法:fmt [-cstu][-p<列起始字符串>][-w<每列字符數>][--help][--version][文件...]

參  數:
-c或–crown-margin 每段前兩列縮排。
-p<列起始字符串>或-prefix=<列起始字符串> 僅合併含有指定字符串的列,通常運用在程序語言的註解方面。
-s或–split-only 只拆開字數超出每列字符數的列,但不合並字數不足每列字符數的列。
-t或–tagged-paragraph 每列前兩列縮排,但第1列和第2列的縮排格式不同。
-u或–uniform-spacing 每個字符之間都以一個空格字符間隔,每個句子之間則兩個空格字符分隔。
-w<每列字符數>或–width=<每列字符數>或-<每列字符數> 設置每列的最大字符數。

文本的提取

cut命令

cut命令可以從一個文本文件或者文本流中提取文本列。

cut [選項]… [文件]…

選項說明:

-b, –bytes=LIST 以字節爲單位取出固定字節區間

-c, –characters=LIST 以字符爲單位取出固定字符區間

-d, –delimiter=DELIM 指定分隔符來代替默認的TAB分隔符

-f, –fields=LIST 依據 -d 指定的分隔符將一段內容分割成爲數段,用 -f 取出第幾段的意思

-n with -b: 不分隔多字節字符

–complement 補充選定的字節,字符集或字段

-s, –only-delimited 不打印不包含分隔符的行

–output-delimiter=STRING 使用String 作爲輸出分隔符,默認的是使用輸入分隔符

僅使用f -b, -c 或-f 中的一個。每一個列表都是專門爲一個類別作出的,或者您可以用逗號隔   開要同時顯示的不同類別。您的輸入順序將作爲讀取順序,每個僅能輸入一次。   每種參數格式表示範圍如下:    N    從第1 個開始數的第N 個字節、字符或域    N-    從第N 個開始到所在行結束的所有字符、字節或域    N-M    從第N 個開始到第M 個之間(包括第M 個)的所有字符、字節或域    -M    從第1 個開始到第M 個之間(包括第M 個)的所有字符、字節或域  

例子:

1,測試文件

[zhangy@BlackGhost comte]$ cat test
test:x:1003:1003::/home/test:/bin/bash
張ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false

上面是/etc/passwd文件中的一部分,加了點中文在裏面

2,-b和-c的用法

[zhangy@BlackGhost comte]$ cut -b 1-10 test     //取得文件中第1個字節到第10個字節的內容
test:x:100
張ying:x:
policykit:
postfix:x:
[zhangy@BlackGhost comte]$ cut -b 1,4,5,7,10 test  //取文件中第1,4,5,7,10字節的內容
tt::0
�yig:    //爲什麼會出現亂碼嗎,因爲漢字所佔字節數大於1,分開的話,肯定會顯示錯誤的
pick:
ptfx:

-c的用法根-b差不多,只不過一個截取時是字節爲單位,一個是以字符爲單位

3,-d和-f的用法

[zhangy@BlackGhost comte]$ cut -f 1 test     //不分割都顯示出來
test:x:1003:1003::/home/test:/bin/bash
張ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false
[zhangy@BlackGhost comte]$ cut -d : -f1  test  //分割了顯示分割後的第一個域
test
張ying
policykit
postfix

-d後面根的冒號是分割文件行的的分割符,-d一般情況下根-f一起使用,而不能和-b,-c一起使用

4,-s的用法

[zhangy@BlackGhost comte]$ cut -d : -f 1-5 -s --output-delimiter="|" test
test|x|1003|1003|
張ying|x|1004|1004|
policykit|x|102|1005|PolicyKit
postfix|x|73|73|

-s起到了輸出控制的作用。

使用join連接字段

join  命令

功能說明:將兩個文件中,指定欄位內容相同的行連接起來。

語  法:join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<欄位>][-2<欄位>][--help][--version][文件1][文件2]

補充說明:找出兩個文件中,指定欄位內容相同的行,並加以合併,再輸出到標準輸出設備。

參  數:
  -a<1或2>   除了顯示原來的輸出內容之外,還顯示指令文件中沒有相同欄位的行。
  -e<字符串>   若[文件1]與[文件2]中找不到指定的欄位,則在輸出中填入選項中的字符串。
  -i或--igore-case   比較欄位內容時,忽略大小寫的差異。
  -o<格式>   按照指定的格式來顯示結果。
  -t<字符>   使用欄位的分隔字符。
  -v<1或2>   跟-a相同,但是隻顯示文件中沒有相同欄位的行。
  -1<欄位>   連接[文件1]指定的欄位。
  -2<欄位>   連接[文件2]指定的欄位。
join類似 db裏面的join方法,同樣有left join right join inner join等

指定參數-a 可以指定join的方式。 -a1表示 顯示第一個文件中不匹配的行,即爲left join
                                            -a2 表示 顯示第二個文件中不匹配的行,即爲right join

使用示例:

$ cat employee.txt
100 Jason Smith
200 John Doe
300 Sanjay Gupta
400 Ashok Sharma
$ cat bonus.txt
100 $5,000
200 $500
300 $3,000
400 $1,250
$ join employee.txt bonus.txt
100 Jason Smith $5,000
200 John Doe $500
300 Sanjay Gupta $3,000
400 Ashok Sharma $1,250


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章