重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
linux基礎-字符處理
成都創新互聯于2013年創立,是專業互聯網技術服務公司,擁有項目成都網站設計、成都網站制作網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元羅源做網站,已為上家服務,為羅源各地企業和個人服務,聯系電話:18980820575
linux管道命令(pipe)
菜鳥教程
管道是一種通信機制,通常用于進程間的通信,它表現出來的形式將前面每一個進程的輸出直接作為下一個進程的輸入。
管道命令使用 | 作為界定符號。
默認情況下,sort命令以第一列進行排序
反向排序
按指定列進行排序,默認是空白符,也可以用 -t 指定分隔符
第二列排序的時候可以加 -n 進行數值排序
進行排序后,排序結果會顯示在終端,但是原文件不會改變,可以用-o重定向或者另存。用 覆蓋某個文件會失敗,數據被清空,但是用 追加可以
為初學者提供的uniq命令教程及示例
uniq 命令用于檢查及刪除文本文件中重復出現的行列。uniq命令只有在相鄰的情況下才會刪除重復的行,因此一般與 sort 命令結合使用,此外,該命令也可以檢查文本文件中重復出現的行列,默認區分大小寫。
準備一個文件
準備一個文件
以分割符指定分割某些特定的列
Linux tr 命令用于轉換或刪除文件中的字符。
tr 指令從標準輸入設備讀取數據,經過字符串轉譯后,將結果輸出到標準輸出設備。
語法:tr [OPTION]…SET1[SET2]
小寫轉換為大寫
刪除字符
Linux paste 命令用于合并文件的列。
paste 指令會把每個文件以列對列的方式,一列列地加以合并。
不加參數會默認以制表符為分界列對列合并
-d可以設置以何種字符合并
使用s參數時。單個文件會將該文件的多行數據合并成一行顯示,多個文件會將各個文件單獨合并成一行之后再行對行合并
Linux split命令用于將一個文件分割成數個。
該指令將大文件分割成較小的文件,在默認情況下將按照每1000行切割成一個小文件。
將根目錄文件信息寫入文件
對上面的文件9行為一個文件進行分割
以1k字節分割文件
不加參數會同時顯示行數,字數,Bytes數,加上上述參數會單獨顯示其中一項
uniq 命令
文字
uniq 是LINUX命令
用途
報告或刪除文件中重復的行。
語法
uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] [ -Fields ] [ +Characters ] [ InFile [ OutFile ] ]
描述
uniq 命令刪除文件中的重復行。
uniq 命令讀取由
InFile 參數指定的標準輸入或文件。該命令首先比較相鄰的行,然后除去第二行和該行的后續副本。重復的行一定相鄰。(在發出 uniq
命令之前,請使用 sort 命令使所有重復行相鄰。)最后,uniq 命令將最終單獨的行寫入標準輸出或由 OutFile
參數指定的文件。InFile 和 OutFile 參數必須指定不同的文件。如果輸入文件用“-
”表示,則從標準輸入讀?。惠斎胛募仨毷俏谋疚募?。文本文件是包含組織在一行或多行中的字符的文件。這些行的長度不能超出
2048 個字節(包含所有換行字符),并且其中不能包含空字符。
缺省情況下,uniq 命令比較所有行。如果指定了-f Fields 或 -Fields 標志, uniq 命令忽略由 Fields 變量指定的字段數目。 field 是一個字符串,用一個或多個 空格 字符將它與其它字符串分隔開。
如果指定了 -s Characters 或 -Characters 標志, uniq 命令忽略由 Characters 變量指定的字段數目。為 Fields 和 Characters 變量指定的值必須是正的十進制整數。
當前本地語言環境決定了 -f 標志使用的 空白 字符以及 -s 標志如何將字節解釋成字符。
如果執行成功,uniq 命令退出,返回值 0。否則,命令退出返回值大于 0。
標志
-c 在輸出行前面加上每行在輸入文件中出現的次數。
-d 僅顯示重復行。
-u 僅顯示不重復的行。
-f Fields 忽略由 Fields 變量指定的字段數目。如果 Fields 變量的值超過輸入行中的字段數目, uniq 命令用空字符串進行比較。這個標志和 -Fields 標志是等價的。
-s Characters
忽略由 Characters 變量指定的字符的數目。如果 Characters 變量的值超過輸入行中的字符的數目, uniq
用空字符串進行比較。如果同時指定 -f 和 -s 標志, uniq 命令忽略由 -s Characters 標志指定的字符的數目,而從由 -f
Fields 標志指定的字段后開始。 這個標志和 +Characters 標志是等價的。
-Fields 忽略由 Fields 變量指定的字段數目。這個標志和 -f Fields 標志是等價的。
+Characters
忽略由 Characters 變量指定的字符的數目。如果同時指定 - Fields 和 +Characters 標志, uniq 命令忽略由
+Characters 標志指定的字符數目,并從由 -Fields 標志指定的字段后開始。 這個標志和 -s Characters
標志是等價的。
- c 顯示輸出中,在每行行首加上本行在文件中出現的次數。它可取代- u和- d選項。
- d 只顯示重復行 。
- u 只顯示文件中不重復的各行 。
- n 前n個字段與每個字段前的空白一起被忽略。一個字段是一個非空格、非制表符的字符串,彼此由制表符和空格隔開(字段從0開始編號)。
+ n 前n個字符被忽略,之前的字符被跳過(字符從0開始編號)。
- f n 與- n相同,這里n是字段數。
- s n 與+n相同,這里n是字符數。
退出狀態
該命令返回以下退出值:
0 命令運行成功。
0 發生錯誤。
補充
文件經過處理后在它的輸出文件中可能會出現重復的行。例如,使用cat命令將兩個文件合并后,再使用sort命令進行排序,就可能出現重復行。這時可以使用uniq命令將這些重復行從輸出文件中刪除,只留下每條記錄的唯一樣
示例
要刪除名為 fruit 文件中的重復行并將其保存到一個名為 newfruit 的文件中,輸入:
uniq fruit newfruit
如果 fruit 文件包含下列行:
apples
apples
peaches
pears
bananas
cherries
cherries
則在您運行uniq 命令后 newfruit 文件將包含下列行:
apples
peaches
pears
bananas
cherries
文件/usr/bin/uniq 包含 uniq 命令。
# uniq -c 的用法,例如:
harley
casely
weedly
harley
linda
#cut -c 1-8 | sort | uniq -c result.txt
1 casely
2 harley
1 linda
1 weekly
1. 顯示文件example中不重復的行。
uniq - u example
2. 顯示文件example中不重復的行,從第2個字段的第2個字符開始做比較。
uniq - u - 1 +1 example
wk肯定行
這是一個cu的精華帖,差不多,對于你的問題你給稍等我修改一下。(ps感謝紅袖添香大姐)
CU精華 經典回顧
#假設我有如下文件:
#cat aa
#123 def1 456
#345 def2 812
#123 def3 563
#322 def4 684
#123 def5 879
#......................
#現在我想把第一列中字段相同的合并,第一列不相同的則保留,合并的原則就是保留第一個出現的前兩個字段,第三個字段則把結果相加,以上面的示例為例:
#
#就是對于123開頭的需要合并,合并后應該成為如下:
#cat aa
#123 def1 1898
#345 def2 812
#322 def4 684
#請問用shell如何實現?
#希望各位幫助!,謝謝!!
#要求總結:
#1 合并相同的第一列數據,并且計算第三列和
#2 第二列只保留第一次出現
#3 第一列順序不變
覺得這個問題很經典,所以從CU論壇轉過來了。
請大家一起學習
我們站在巨人的肩膀上。
問題補充:
看不太懂實現可以講一下思路嗎?
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
我是這樣做的
--------------------------2
謝謝你的補充, 已經明白了你對split的適用技巧,是用split(a[$1],tmp)在碰到匹配的$1時取出以前的統計結然后再用$3加上以前的結果是吧,很巧妙。謝謝
但是有2個問題:
1不滿足 第二列保留第一次出現記錄(現在是保留最后一次出現)
2不滿足 第一列按照原來文件順序出現
看看這個
awk 'BEING
{
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
if($1 in ind)next
ind[$1]
key[n]=$1
n++
}
END{
for(i in key)print key[i],b[key[i]],a[key[i]]
}' filename
#######################
#######################
#######################
這樣就行了
#!/bin/bash
awk 'BEGIN
{
if($0 in a)next
a[$0]
b[n]=$0
n++
}
END{
for(i in b)print b[i]
}' data
前提是你的數據文件里面每行沒有空格,如果有用-F設定一個沒有的字符作分隔符就
Linux下常用文本處理命令大全
Linux下面有很多經典的非常有用的命令,其中處理文本的命令就有很多。下面就讓我們一起看看這些經典的Linux文本處理命令有哪些吧。
一. sort
文件排序, 通常用在管道中當過濾器來使用. 這個命令可以依據指定的關鍵字或指定的字符位置, 對文件行進行排序. 使用-m選項, 它將會合并預排序的輸入文件. 想了解這個命令的全部參數請參考這個命令的info頁.
二. tsort
拓撲排序, 讀取以空格分隔的有序對, 并且依靠輸入模式進行排序.
三. uniq
這個過濾器將會刪除一個已排序文件中的重復行. 這個命令經常出現在sort命令的管道后邊.
四. expand, unexpand
expand命令將會把每個tab轉化為一個空格. 這個命令經常用在管道中.
unexpand命令將會把每個空格轉化為一個tab. 效果與expand命令相反.
五. cut
一個從文件中提取特定域的工具. 這個命令與awk中使用的print $N命令很相似, 但是更受限. 在腳本中使用cut命令會比使用awk命令來得容易一些. 最重要的選項就是-d(字段定界符)和-f(域分隔符)選項.
六. paste
將多個文件, 以每個文件一列的形式合并到一個文件中, 合并后文件中的每一列就是原來的一個文件. 與cut結合使用, 經常用于創建系統log文件.
七. join
這個命令與paste命令屬于同類命令. 但是它能夠完成某些特殊的目地. 這個強力工具能夠以一種特殊的形式來合并兩個文件, 這種特殊的形式本質上就是一個關聯數據庫的簡單版本.
join命令只能夠操作兩個文件. 它可以將那些具有特定標記域(通常是一個數字標簽)的行合并起來, 并且將結果輸出到stdout. 被加入的文件應該事先根據標記域進行排序以便于能夠正確的匹配.
八. head
把文件的頭部內容打印到stdout上(默認為10行, 可以自己修改). 這個命令有一些比較有趣的選項.
九. tail
將一個文件結尾部分的內容輸出到stdout中(默認為10行). 通常用來跟蹤一個系統logfile的.修改情況, 如果使用-f選項的話, 這個命令將會繼續顯示添加到文件中的行.
十. wc
wc可以統計文件或I/O流中的”單詞數量”:
十一. fold
將輸入按照指定寬度進行折行. 這里有一個非常有用的選項-s, 這個選項可以使用空格進行斷行(譯者: 事實上只有外文才需要使用空格斷行, 中文是不需要的)(請參考例子 12-23和例子 A-1).
十二. fmt
一個簡單的文件格式器, 通常用在管道中, 將一個比較長的文本行輸出進行”折行”.
十三. col
這個命令用來濾除標準輸入的反向換行符號. 這個工具還可以將空白用等價的tab來替換. col工具最主要的應用還是從特定的文本處理工具中過濾輸出, 比如groff和tbl. (譯者: 主要用來將man頁轉化為文本.)
十四. column
列格式化工具. 通過在合適的位置插入tab, 這個過濾工具會將列類型的文本轉化為”易于打印”的表格式進行輸出.
十五. colrm
列刪除過濾器. 這個工具將會從文件中刪除指定的列(列中的字符串)并且寫到文件中, 如果指定的列不存在, 那么就回到stdout. colrm 2 4 filename將會刪除filename文件中每行的第2到第4列之間的所有字符. p="" /filename將會刪除filename文件中每行的第2到第4列之間的所有字符.
Caution: 如果這個文件包含tab和不可打印字符, 那將會引起不可預期的行為. 在這種情況下, 應該通過管道的手段使用expand和unexpand來預處理colrm.
十六. nl
計算行號過濾器. nl filename將會把filename文件的所有內容都輸出到stdout上, 但是會在每個非空行的前面加上連續的行號. 如果沒有filename參數, 那么就操作stdin.
nl命令的輸出與cat -n非常相似, 然而, 默認情況下nl不會列出空行.
十七. pr
格式化打印過濾器. 這個命令會將文件(或stdout)分頁, 將它們分成合適的小塊以便于硬拷貝打印或者在屏幕上瀏覽. 使用這個命令的不同的參數可以完成好多任務, 比如對行和列的操作, 加入行, 設置頁邊, 計算行號, 添加頁眉, 合并文件等等. pr命令集合了許多命令的功能, 比如nl, paste, fold, column, 和expand.
pr -o 5 –width=65 fileZZZ | more 這個命令對fileZZZ進行了比較好的分頁, 并且打印到屏幕上. 文件的縮進被設置為5, 總寬度設置為65.
一個非常有用的選項-d, 強制隔行打印(與sed -G效果相同).
十八. gettext
GNU gettext包是專門用來將程序的輸出翻譯或者本地化為不同國家語言的工具集. 在最開始的時候僅僅支持C語言, 現在已經支持了相當數量的其它程序語言和腳本語言.
想要查看gettext程序如何在shell腳本中使用. 請參考info頁.
十九. msgfmt
一個產生二進制消息目錄的程序. 這個命令主要用來本地化.
二十. iconv
一個可以將文件轉化為不同編碼格式(字符集)的工具. 這個命令主要用來本地化.
二十一. recode
可以認為這個命令是上邊iconv命令的專業版本. 這個非常靈活的并可以把整個文件都轉換為不同編碼格式的工具并不是Linux標準安裝的一部分.
二十二. TeX, gs
TeX和Postscript都是文本標記語言, 用來對打印和格式化的視頻顯示進行預拷貝.
TeX是Donald Knuth精心制作的排版系統. 通常情況下, 通過編寫腳本的手段來把所有的選項和參數封裝起來一起傳到標記語言中是一件很方便的事情.
用uniq,如下,將 1.txt 中 所有 "相鄰" 重復行合并成一行,結果存入 2.txt
uniq?1.txt??2.txt
如果是想將相鄰重復行徹底刪掉(而不是合并成一行),可以用
uniq?-u?1.txt??2.txt
通常如果我們想獲取一個文件里不重復的行的時候,我們可以直接通過?sort?-u?命令,先把文件排序,然后去掉連續的重復行就行。
可是,如果我們去掉重復行之后,還想保留文件原有的順序,該怎么辦呢?
雖然 Linux 下有個看上去似乎很有用的命令叫uniq,但事實上?uniq?命令僅僅只對連續的重復行有效。
如果不排序,直接使用 uniq 命令是沒有用的;使用?sort?-u?的話,我們就丟失了文件原有的行的順序了。
一個終極的解決方案是使用 awk:
簡要解釋一下:awk 的基本執行流程是,對文件的每一行,做一個指定的邏輯判斷,如果邏輯判斷成立,則執行指定的命令;如果邏輯判斷不成立,則直接跳過這一行。
我們這里寫的 awk 命令是!x[$0]++,意思是,首先創建一個 map 叫x,然后用當前行的全文$0作為 map 的 key,到 map 中查找相應的 value,如果沒找到,則整個表達式的值為真,可以執行之后的語句;如果找到了,則表達式的值為假,跳過這一行。
由于表達式之后有++,因此如果某個 key 找不到對應的 value,該++操作會先把對應的 value 設成 0,然后再自增成 1,這樣下次再遇到重復的行的時候,對應的 key 就能找到一個非 0 的 value 了。
我們前面說過,awk 的流程是先判斷表達式,表達式為真的時候就執行語句,可是我們前面寫的這個 awk 命令里只有表達式,沒有語句,那我們執行什么呢?原來,當語句被省略的時候,awk 就執行默認的語句,即打印整個完整的當前行。就這樣,我們通過這個非常簡短的 awk 命令實現了去除重復行并保留原有文件順序的功能。