日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

3-7:常见任务和主要工具之文本处理

發(fā)布時(shí)間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3-7:常见任务和主要工具之文本处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一:復(fù)習(xí)cat,sort和uniq
    • (1)cat-進(jìn)行文件拼接并且輸出到標(biāo)準(zhǔn)輸出
    • (2)sort-對(duì)文本進(jìn)行排序
    • (3)uniq-通知或省略重復(fù)的行
  • 二:切片和切塊
    • (1)cut-提取文本行中的部分內(nèi)容
    • (2)paste-合并文本行
    • (3)join-連接兩個(gè)文件中具有相同字段的行
  • 三:文本比較
    • (1)comm-逐行比較兩個(gè)已經(jīng)排序的文件
    • (2)diff-逐行比較文件
    • (3)patch-對(duì)原文件進(jìn)行diff操作
  • 四:非交互式文本編輯
    • (1)tr-替換和刪除字符
    • (2)sed-文本過(guò)濾和轉(zhuǎn)換的流編輯器
    • (3)aspell-交互式拼寫(xiě)檢查工具

本章使用到的命令有

  • cat:連接文件并打印到標(biāo)準(zhǔn)輸出
  • sort:對(duì)文本進(jìn)行排序
  • uniq:報(bào)告并省略重復(fù)行
  • cut:從每一行中移除文本區(qū)域
  • paste:合并文件文本行
  • join:基于某個(gè)共享字段來(lái)聯(lián)合兩個(gè)文件的文本行
  • comm:逐行比較兩個(gè)已經(jīng)排好序的文件
  • diff:逐行比較文件
  • patch:對(duì)原文件打補(bǔ)丁
  • tr:轉(zhuǎn)換或刪除字符
  • sed:用于過(guò)濾和轉(zhuǎn)換文本的流編輯器
  • aspel:交互式拼寫(xiě)檢查器

一:復(fù)習(xí)cat,sort和uniq

這三個(gè)命令在之前的講述中我們就見(jiàn)到過(guò),現(xiàn)在要對(duì)它們做更深層次的理解

(1)cat-進(jìn)行文件拼接并且輸出到標(biāo)準(zhǔn)輸出

在第6章的講述中,我們說(shuō)過(guò)cat命令可以用來(lái)拼接文本。

cat命令可以提高文本內(nèi)容的可視化效果,比如說(shuō)他可以查看控制字符,比如說(shuō)制表符,我們知道控制字符屬于非打印字符
如下,根據(jù)之前的描述我們將輸入cat>test.txt,表示將標(biāo)準(zhǔn)輸入的內(nèi)容重定向到文件中,最后輸入Ctrl+D以告訴其輸入結(jié)束,輸入時(shí)特意在開(kāi)頭輸入制表符,在結(jié)尾輸入空格,然后使用cat -A選項(xiàng)查看這個(gè)文件,會(huì)發(fā)現(xiàn)非打印字符顯示在了屏幕上

其余選項(xiàng)如下

(2)sort-對(duì)文本進(jìn)行排序

sort是一個(gè)排序程序,它的操作對(duì)象為標(biāo)準(zhǔn)輸入或是命令行中指定的一個(gè)或多個(gè)文件,然后將結(jié)果發(fā)送至標(biāo)準(zhǔn)輸出,需要注意的是其排序的依據(jù)是每行的首字母

由于sort參數(shù)可以是多個(gè)文件,這就意味著它可以把多個(gè)文件按照字母順序進(jìn)行排序,并整合到一個(gè)文件中

sort的選項(xiàng)如下

其中sort-n需要注意一下,該參數(shù)的意思是根據(jù)數(shù)值進(jìn)行排序,還有-k選項(xiàng)可以根據(jù)一條記錄(你可以理解為每一行)的某個(gè)字段(你可以理解為某一列)進(jìn)行排序

舉個(gè)例子,ls命令默認(rèn)輸入結(jié)果是下面這樣子的,可以看出其排序時(shí)不是按照文件大小排序的

而如果輸入ls -l /usr/bin | sort -nr -k 5 |head,則表示排序時(shí)依據(jù)第5個(gè)字段采用降序排序

關(guān)于這個(gè)-k選項(xiàng)還是有必要和大家多討論討論,因?yàn)?k選項(xiàng)用處真的很大。如下列出了16條記錄,每條記錄第一個(gè)字段是Linux版本名,第二個(gè)字段是版本號(hào),第三個(gè)字段是發(fā)行時(shí)間

SUSE 10.2 12/07/2006 Fedora 10 11/25/2008 SUSE 11.0 06/19/2008 Ubuntn 8.04 04/24/2008 Fedora 8 11/08/2007 SUSE 10.3 10/04/2007 Ubuntn 6.10 10/26/2006 Fedora 7 05/31/2007 Ubuntn 7.10 10/18/2007 Ubuntn 7.04 04/19/2007 SUSE 10.1 05/11/2006 Fedora 6 10/24/2006 Fedora 9 05/13/2008 Ubuntn 6.06 06/01/2006 Ubuntn 8.10 10/30/2008 Fedora 5 03/20/2006

如果直接將其排序

可以發(fā)現(xiàn)排序的結(jié)果基本正確,但是同發(fā)行版本的版本號(hào)卻出現(xiàn)了一定錯(cuò)誤,比如10排在了其余數(shù)字前面。這說(shuō)明排序是有問(wèn)題的,類(lèi)比于Excel,大家還記得我們?cè)贓xcel中排序時(shí)也有一個(gè)主要關(guān)鍵字和次要關(guān)鍵字嗎,如果主要關(guān)鍵字時(shí)發(fā)行版本名字,那么次要關(guān)鍵字就是版本號(hào),也就是要在版本名字排序好之后再對(duì)同版本的進(jìn)行版本號(hào)的排序
而sort的-k選項(xiàng)也可以輸入多個(gè)排序參數(shù),每個(gè)參數(shù)可以是一個(gè)字段范圍,如果沒(méi)有指定字段范圍,sort會(huì)從改字段開(kāi)始直接覆蓋到末尾

所以我們可以輸入sort -k 1,1 -k 2n test.txt,其中-k 1,1表示開(kāi)始于第一個(gè)字段結(jié)束于第一個(gè)字段,-k 2n表示開(kāi)始于第2個(gè)字段,并且以數(shù)值的進(jìn)行排序

可以發(fā)現(xiàn)效果就比剛才好多了

如果要使用時(shí)間進(jìn)行排序呢,上圖中的這種格式的時(shí)間并不利用我們排序,但是-k選項(xiàng)中的參數(shù)偏移可以解決這個(gè)問(wèn)題
輸入sort -k 3.7nb -k 3.1nb -k3.4nb test.txt,表示主關(guān)鍵字排序?yàn)榈谌齻€(gè)字段偏移7位(年),二號(hào)關(guān)鍵字是第三個(gè)字段偏移1位(月),三號(hào)關(guān)鍵字是第三個(gè)字段偏移4位(日),然后注意添加b選項(xiàng),消除空格,防止排序錯(cuò)亂

有些記錄并不是按照空格分隔字段的,比如下面的/etc/passwd,它是按照冒號(hào)分隔字段的

幸運(yùn)的是,sort的-t選項(xiàng)可以讓我們自己指定分隔符
比如輸入sort -t ':' -k 3n /etc/passwd,表示對(duì)第三個(gè)字段進(jìn)行數(shù)值排序

(3)uniq-通知或省略重復(fù)的行

uniq前面咋們就了解過(guò),但是這里要強(qiáng)調(diào)的一點(diǎn)是uniq只能取出已經(jīng)排序好的文本中的重復(fù)的行,因?yàn)閡niq去除的是相鄰的重復(fù)行

其選項(xiàng)如下

二:切片和切塊

(1)cut-提取文本行中的部分內(nèi)容

cut命令用從文本行中提取一段文字并將其輸出至標(biāo)準(zhǔn)輸出
其選項(xiàng)如下

cut其實(shí)并不好去處理文件,因?yàn)槲募械膬?nèi)容字段的分隔有可能并不是特別規(guī)范,它特別適合處理一些命令的輸出結(jié)果
其中-d用于指定分隔符,-f用于提取第幾個(gè)字段的內(nèi)容,-c可以指定字段范圍并將其提取

以cat /etc/passwd為例

cat /etc/passwd | cut -d ':' -f 1,表示以冒號(hào)分割,查看第一個(gè)字段的內(nèi)容

cat /etc/passwd | cut -d ':' -f 1 | cut -c 1-3,表示截取上述結(jié)果的第1-3個(gè)字符

(2)paste-合并文本行

paste命令是cut的逆操作,它向文件中增加一個(gè)或是更多的文本列,該命令讀取多個(gè)文件并將每個(gè)文件中提取出的字段結(jié)合為一個(gè)整體的標(biāo)準(zhǔn)輸出流

舉例:首先我先講/etc/passwd重定向到了test中,這個(gè)文件中每條記錄有7個(gè)字段,cut -d ':' -f 1,2,3 test > 123表示將前3個(gè)字段截取放到文件123中

cut -d ‘:’ -f 4,5,6,7 test >4567也是這個(gè)道理

然后paste 4567 123 > 4567123表示將4567的內(nèi)容放在,123中的內(nèi)容放在后,然后全部合并至4567123中

(3)join-連接兩個(gè)文件中具有相同字段的行

簡(jiǎn)單來(lái)說(shuō)說(shuō)join命令用于合并兩個(gè)文件中具有公共字段的記錄
比如如下兩個(gè)文件中都有相同的公共字段,也就是姓名

然后使用join table1 table 2 > table3,就表示合并公共字段

三:文本比較

(1)comm-逐行比較兩個(gè)已經(jīng)排序的文件

comm命令用于文本文件的比較,顯示文件中相異的行以及相同的行
如下有兩個(gè)文件compare1 和compare2

然后輸入comm compare1 compare2

第一列會(huì)顯示文件1獨(dú)有的行,第二列會(huì)顯示文件2獨(dú)有的行,第三列會(huì)顯示他們相同的行

此外,comm還有-n選項(xiàng),表示輸入時(shí)忽略某幾兩列,比如comm -12 表示輸入他們相同的行

(2)diff-逐行比較文件

(3)patch-對(duì)原文件進(jìn)行diff操作

四:非交互式文本編輯

(1)tr-替換和刪除字符

tr命令可以對(duì)標(biāo)準(zhǔn)輸入進(jìn)行操作并且將結(jié)果以標(biāo)準(zhǔn)形式輸出
如下test中有小寫(xiě)和大寫(xiě)混合而成的文本

使用tr命令將其全部轉(zhuǎn)換為小寫(xiě)可以輸入:cat test | tr A-Z a-z | tee test

tr有兩個(gè)參數(shù)分別是被替換的和替換的字符集
字符集的表示方法可以有如下三種

  • 枚舉:比如ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • 字符范圍(注意排序):比如a-z
  • POSIX字符類(lèi):比如[:upper:]

一般情況下兩個(gè)字符集是等長(zhǎng)的,但是也可以不等長(zhǎng),比如

如果加上-d選項(xiàng)表示刪除字符集1中出現(xiàn)的字符

加上-s選項(xiàng)可以刪除標(biāo)準(zhǔn)輸入中相鄰的重復(fù)字符

(2)sed-文本過(guò)濾和轉(zhuǎn)換的流編輯器

sed是流式編輯器的縮寫(xiě),可以對(duì)文本流,指定文件集或標(biāo)準(zhǔn)輸入進(jìn)行文本編輯器,其功能非常強(qiáng)大
sed第一個(gè)引用就是替換,這一點(diǎn)和vim中替換有些相似
輸入cat test | se "s/aaaaa/ccccc/",表示把a(bǔ)替換為c

sed中多數(shù)命令可以在其前添加一個(gè)地址,該地址用來(lái)指定輸入流的哪一行被編輯
如果省略地址,則會(huì)對(duì)所有行進(jìn)行編輯

地址不僅可以用數(shù)字表示,而且還有如下眾多表示方法



其中s命令是sed中使用最為廣泛的參數(shù),

(3)aspell-交互式拼寫(xiě)檢查工具

總結(jié)

以上是生活随笔為你收集整理的3-7:常见任务和主要工具之文本处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。