Linux文字處理命令--cut分割檔案和sed查詢替換的運用
今天遇到一個數據檔案需要處理,文字約1萬行,檔案每行都是以$字元進行分隔的各種資料列,每行38列。我需要取其中的某一些列,基本都集中在前10列。最初的想法是使用UltraEdit工具進行處理,使用正則表示式查找出了每行中間所需要的內容,無奈UE只支援按行復制,無法單獨複製匹配的部分。思來想去,打算到Linux下進行處理,順便也複習一下常用的一些文字處理命令。Linux命令太強大了,問題果然幾需要幾步就迎刃而解了。
原始檔列格式(以下為示例3行):
0202435718:79849391866393:D02502402$000236677201$00023667720101$D025024028727$D025024028727$D02502402$2015-06-08 13:36:07$0202435718$025301895457$ $0259000$10 $1020 $8727 $126894718$三星手機G9200(鉑光金)$000061659$1.0 $D025 $8727$10032424 $20 $訂單生效 $2015-06-08 13:36:07$20 $ $ $ $ $8727 $0$ZOR$2015-06-08 13:36:07$R1901001$$5288.0$$N$2015-06-08 13:37:59 6107547155:79849391865963:7089781102$000236677899$00023667789902$7016605928$7089781102$O22106565$2015-06-08 13:40:37$6107547155$6107547155$ $4320501$50 $2700 $9465 $121225083$格蘭仕(Galanz)微波爐 P70F23P-G5(SO)$000070689$1.0$D002$0002$10038318$80$訂單取消$2015-06-11 18:00:00$13$$$$$$0$ZOR$2015-06-08 13:40:37$R2201001$$399.0$MOBILE|02|01|3.0|10308$N$2015-06-08 13:40:36 6022048888:79849391866085:8091232198$000236678249$00023667824901$8016551693$8091232198$P22142344$2015-06-08 13:39:15$6022048888$6022048888$ $7720200$50 $3100 $9436 $109182779$kidsme親親我 搖鈴組合牙刷 130065AE$000190BXL$1.0$D069$0001$10079703$70$訂單拒收退$2015-06-10 18:00:00$14$$$$$K772020601$0$ZOR$2015-06-08 13:39:15$R9003035$$8.9$WAP$N$
我需要的內容為:
以$符為分隔,第3,5,6,7,8列,並且將第7列日期格式由yyyy-mm-dd hh:mm:ss修改為yyyymmddhhmmss,最終各列以,分隔
通過分析處理步驟,可知大致處理步驟為三步:
1.分割檔案並取出需要的列;——使用cut命令
2.查詢並替換日期格式;——使用sed命令
3.查詢列分隔符$並替換為, ——使用sed命令
1. 檔案分割
cut命令的用法:
[[email protected] ~]# cut -d '分隔字元' -f fields <==用於有特定分隔字元
[[email protected] ~]# cut -c 字元區間 <==用於排列整齊的訊息
選項與引數:
-d :後面接分隔字元。與 -f 一起使用;
-f :依據 -d 癿分隔字元將一段訊息分割成為數段,用 -f 取出第幾段的意思;
-c :以字元 (characters) 的單位取出固定字元區間;
原始檔檔名為source.txt,並上傳至伺服器:
[[email protected] cut]$ ll
total 3524
drwxrwxr-x 2 loguser loguser 4096 Dec 29 16:31 ok
-rw-r--r-- 1 loguser loguser 3598763 Dec 29 16:30 source.txt
因檔案行數較多,我們這裡把結果檔案輸出到result.txt檔案中,那麼這裡第一步我們需要使用的命令為:
cut -d '$' -f 3,5,6,7,8 source.txt > result.txt
[[email protected] cut]$ cut -d '$' -f 3,5,6,7,8 source.txt > result.txt
[[email protected] cut]$ ll
total 4208
drwxrwxr-x 2 loguser loguser 4096 Dec 29 16:31 ok
-rw-rw-r-- 1 loguser loguser 694021 Dec 29 16:33 result.txt
-rw-r--r-- 1 loguser loguser 3598763 Dec 29 16:30 source.txt
[[email protected] cut]$
可以檢視一下前10行的內容,看檔案格式是否符合要求:head -n 10 result.txt
[[email protected] cut]$ head -n 10 result.txt
00023667720101$D025024028727$D02502402$2015-06-08 13:36:07$0202435718
00023667789902$7089781102$O22106565$2015-06-08 13:40:37$6107547155
00023667824901$8091232198$P22142344$2015-06-08 13:39:15$6022048888
00023667938001$D002291287852$D00229128$2015-06-08 13:42:32$0101855315
00023667967601$D003101939312$D00310193$2015-06-08 13:44:07$6107554066
00023668329501$D000577509545$D00057750$2015-06-08 13:52:58$6016175500
00023668400101$D021609489358$D02160948$2015-06-08 13:54:58$6107422418
00023668457901$D004719687172$D00471968$2015-06-08 13:56:40$6100439132
00023668851801$4089771406$I22114577$2015-06-08 14:14:33$2214456603
00023668867701$1097223690$C23934507$2015-06-08 14:04:48$6107463339
[[email protected] cut]$
如上,已經通過檔案分割得到需要的檔案
2. 檔案查詢替換
Linux下批量替換多個檔案中的字串的簡單方法。用sed命令可以批量替換多個檔案中的字串。
命令如下:sed -i "s/原字串/新字串/g" `grep 原字串 -rl 所在目錄`
例如:我要把 charset=gb2312 替換為 charset=UTF-8,執行命令:sed -i "s/charset=gb2312/charset=UTF-8/g" `grep charset=gb2312 -rl /www`; 即可。
解釋一下:
-i 表示inplace edit,就地修改檔案
-r 表示搜尋子目錄
-l 表示輸出匹配的檔名
這個命令組合很強大,要注意備份檔案。
2.1 將日期格式由yyyy-mm-dd hh:mm:ss修改為yyyymmddhhmmss,即將-,空格和:替換為空即可:
替換命令為,其中查詢的字元支援正則表示式匹配:sed -i "s/[- :]//g" result.txt
[[email protected] cut]$ cp result.txt result-bak.txt
[[email protected] cut]$ ll
total 4892
drwxrwxr-x 2 loguser loguser 4096 Dec 29 16:31 ok
-rw-rw-r-- 1 loguser loguser 694021 Dec 29 16:42 result-bak.txt
-rw-rw-r-- 1 loguser loguser 694021 Dec 29 16:33 result.txt
-rw-r--r-- 1 loguser loguser 3598763 Dec 29 16:30 source.txt
[[email protected] cut]$ sed -i "s/[- :]//g" result.txt
[[email protected] cut]$ head -n 10 result.txt
00023667720101$D025024028727$D02502402$20150608133607$0202435718
00023667789902$7089781102$O22106565$20150608134037$6107547155
00023667824901$8091232198$P22142344$20150608133915$6022048888
00023667938001$D002291287852$D00229128$20150608134232$0101855315
00023667967601$D003101939312$D00310193$20150608134407$6107554066
00023668329501$D000577509545$D00057750$20150608135258$6016175500
00023668400101$D021609489358$D02160948$20150608135458$6107422418
00023668457901$D004719687172$D00471968$20150608135640$6100439132
00023668851801$4089771406$I22114577$20150608141433$2214456603
00023668867701$1097223690$C23934507$20150608140448$6107463339
[[email protected] cut]$
如上,已替換成功。
2.2 替換$字元
$字元在正則匹配的時候會認為是一行的結尾,因此需要使用轉義,同時要注意使用單引號,如下,檔案處理完成後即可得到想要的檔案了:
[[email protected] cut]$ sed -i 's/\$/,/g' result.txt
[[email protected] cut]$ head -n 10 result.txt
00023667720101,D025024028727,D02502402,20150608133607,0202435718
00023667789902,7089781102,O22106565,20150608134037,6107547155
00023667824901,8091232198,P22142344,20150608133915,6022048888
00023667938001,D002291287852,D00229128,20150608134232,0101855315
00023667967601,D003101939312,D00310193,20150608134407,6107554066
00023668329501,D000577509545,D00057750,20150608135258,6016175500
00023668400101,D021609489358,D02160948,20150608135458,6107422418
00023668457901,D004719687172,D00471968,20150608135640,6100439132
00023668851801,4089771406,I22114577,20150608141433,2214456603
00023668867701,1097223690,C23934507,20150608140448,6107463339
[[email protected] cut]$
以下部分為我在網上看到的一些總結,附在這裡補充說明,主要是想強調單引號和雙引號的區別:
Sed裡使用變數的問題,網上有人總結了四種方案:
1.eval sed 's/$a/$b/' filename
2.sed "s/$a/$b/" filename
3..sed 's/'$a'/'$b'/' filename
4..sed s/$a/$b/ filename
我比較喜歡第二種,也就是:Sed後面的表示式一般用單引號引起來('),當需要使用變數時就換用雙引號(")。
關於單雙引號的區別:
單引號:shell處理命令時,對其中的內容不做任何處理。即此時是引號內的內容是sed命令所定義的格式。
雙引號:shell處理命令時,要對其中的內容進行算術擴充套件。如果想讓shell擴充套件後得到sed命令所要的格式,使用命令:sed -n"/\\\\$/p" haha,擴充套件後得到的結果即\\$.
3.小結
總結一下,其實這裡總共使用了三行命令就解決了問題,而且處理速度也比較快:
[[email protected] cut]$ cut -d '$' -f 3,5,6,7,8 source.txt > result.txt
[[email protected] cut]$ sed -i "s/[- :]//g" result.txt
[[email protected] cut]$ sed -i 's/\$/,/g' result.txt
相關推薦
Linux文字處理命令--cut分割檔案和sed查詢替換的運用
今天遇到一個數據檔案需要處理,文字約1萬行,檔案每行都是以$字元進行分隔的各種資料列,每行38列。我需要取其中的某一些列,基本都集中在前10列。最初的想法是使用UltraEdit工具進行處理,使用正則表示式查找出了每行中間所需要的內容,無奈UE只支援按行復制
程式設計小技巧之 Linux 文字處理命令(二)
合格的程式設計師都善於使用工具,正所謂君子性非異也,善假於物也。合理的利用 Linux 的命令列工具,可以提高我們的工作效率。 本篇文章是[《Linux 文字處理命令》](http://remcarpediem.net/article/45ef130c/) 續篇,在前文的基礎上再介紹幾款有用的 Linux
【linux】--- 高階命令列文字處理工具 cut
第一: cut命令 cut : 可以從一個文字檔案或者文字流中提取文字列 echo $PATH 選項 -b:僅顯示行中指定直接範圍的內容; -c:僅顯示行中指定範圍的字元; -d:指定欄位的分隔符,預設的欄位分隔符為“TAB”; -f:顯示指定欄位的內容; --comple
linux——高階文字處理命令之wc、cut、sort
1. wc :Word Count 命令的功能為統計指定檔案中的位元組數、字數、行數,並將統計結果顯示輸出 1.1 命令格式: wc [選項]檔案... 1.2 命令引數: -c 統計位元組數。 -l 統計行
rpm與yum命令、定時任務和sed文字處理
1、簡述rpm與yum命令的常見選項,並舉例rpm命令: 語法:rpm [OPTIONS] [PACKAGE_FILE] 選項: 安裝: -i, --install 升級: -U, --update,-F, --freshen 解除安裝: -e, --erase 查詢: -q
Linux之文字處理命令
Sort 將檔案的每一行作為一個單位,相互比較,比較原則是從首字元向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。 &nb
Linux高階文字處理命令
cut 一、cut命令 功能:cut命令可以從一個文字檔案/文字流中提取文字列 語法: cut -d '分割字元' -f fields ##用於有特定分割字元 cut -c 字元區間 ##用於排列整齊的資訊 選項與引數: -d:後面接分隔字元。與 -f 一起使用;
Linux 系統之文字處理命令
---恢復內容開始--- Linux 系統之文字處理命令 (一)基於關鍵字搜尋 (二)基於列處理文字 (三)文字統計 (四)文字排序 (五)刪除重複行 (六)文字比較 (七)處理文字內容 (八)搜尋替換 (一)基於關鍵字搜尋
linux文字處理常用命令
linux文字處理命令:grep、sed、printf、awk 1.grep grep的作用是按行查詢字元,輸出包含字元的行。 #從檔案查詢 grep 'hello' filename.txt #從管道的輸入查詢 cat filename.txt|grep 'hell
Linux 學習之建立、刪除檔案和資料夾命令
今天學習了幾個命令,是建立、刪除檔案和資料夾的,在linux裡,資料夾是目錄,下面說下我學習的命令。 建立資料夾【mkdir】 一、mkdir命令使用許可權 所有使用者都可以在終端使用 mkdir 命令在擁有許可權的資料夾建立資料夾或目錄。 二
linux 複製目錄中含有隱藏檔案和連結如何處理
1. cp -Rp ——-不會複製隱藏檔案,符號連結的建立時間改變為複製時間了,硬連結被作為檔案複製了, 2 cp -a ————-可以作為比較小的複製,資料量大,可能因記憶體不足,導致失敗 3 tar cvf - * | (cd /dest/
Linux命令--檔案和目錄管理
6.1 Linux檔案系統的組織方式稱作檔案系統分層標準(Filesystem Hierarchy Standard,簡稱FHS),即採用層次式的樹狀目錄結構,此結構的最上層是根目錄“/”。Linux檔名最長允許256個字元,檔名沒有副檔名的概念,對大小寫敏感。 6.2 系統的預設安裝目錄 /:Lin
常用的幾個linux下的文字編輯命令cut、paste、sort、uniq
雖然我更喜歡awk和sed,但是如果能把這幾個命令能活用的話一般的文字編輯就不在話下了,而且這幾個命令更簡單方便一點,但是功能相比awk和sed稍差一點。 一、cut命令 二、paste命令 三、
linux文字處理三劍客(三):awk命令詳解
簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gaw
全網最詳細的Linux命令系列-sed文字處理命令
Sed簡介 SED是一個非互動式文字編輯器,它可對文字檔案和標準輸入進行編輯,標準輸入可以來自鍵盤輸入、文字重定向、字串、變數,甚至來自於管道的文字,與VIM編輯器類似,它一次處理一行內容,Sed可以編輯一個或多個檔案,簡化對檔案的反覆操作、編寫轉換程式等。 Sed命令的原理:在處理文字時把當前處理的行儲存在
Linux目錄處理命令ls
形式 目錄 src 怎麽 bsp back info style 命令 Linux目錄處理命令ls -h 人性化顯示,文件大小以方便的形式輸出 在模擬器上只執行ls:沒有加任何選項,就顯示當前目錄下可見的文件。 在模擬器上只
Linux——文字處理
Linux文字處理命令 cat: 功能:連結檔案並輸出到標準輸出 選項: -n :顯示行號 -E:顯示行結束符($),Windows是(回車符+$)在widows上編輯的檔案在Linux中識別不了了,但是可以使用notepad++軟體編輯的檔案在Linux中可以使用 分屏顯示
rpm與yum命令、定時任務和sed文本處理
ace 百分比 因此 term vpd 包安裝 src image 轉換 1、簡述rpm與yum命令的常見選項,並舉例rpm命令: 語法:rpm [OPTIONS] [PACKAGE_FILE] 選項: 安裝: -i, --install 升級: -U, -
Linux學習第三天--操作檔案和目錄
此時此刻,我們已經準備好了做些真正的工作!這一章節將會介紹以下命令: cp -複製檔案和目錄 mv -移動/重新命名檔案和目錄 mkdir -建立目錄 rm -刪除檔案和目錄 ln -建立硬連結和符號連結 這五個命令屬於最長使用的Linux命
Linux文字處理三劍客awk、sed、grep入門
AWK命令簡介 AWK是一門解釋型的程式語言,它的名字來源於它的三位作者的姓氏:Alfred Aho,Peter Weinberger和Brian Kernighan。AWK能夠應用於廣泛的計算和資料處理任務。所有的GNU/Linux發行版都自帶GAWK,即GNU AWK,