1. 程式人生 > >Linux文字處理命令--cut分割檔案和sed查詢替換的運用

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,