bash處理文字總結
by 小左
在做運維工作的時候, 經常會遇到一些統計需求,從業務側的日誌統計某個業務的運營資料, 不可避免的要對日誌進行文字處理
小左總結了自己在工作常使用的文字處理方法, 分享給大家。
1. 求兩個檔案的交集,並集
交集: 假設有a.txt 和b.txt,每個檔案都有使用者的手機號,每個手機號各佔一行,找出a.txt和b.txt中都有的手機號
法1. awk 'nr==fnr nr>fnr }' a.txt b.txt
法2. 使用grep的-f file選項。 缺點: 當file裡的記錄數稍微多一點, 檢索的速度就變的相當的慢.
並集: 假設有兩個檔案a.txt和b.txt, 其中a.txt中有兩列, 第一列為手機號, 第二列為該手機今天上行的簡訊條數; b.txt中也有兩列,第一列為為手機號, 第二列為該手機號今天的消費數,要求把a,b兩檔案合併成乙個,輸出「手機號 上行簡訊數 消費數」這樣乙個文字, 某列的資料為空則補零
法1. awk 'nr==fnr nr>fnrelse; a[$1]="x" } end } }' a.txt b.txt
法2. 使用join。 缺點: 一是需要對join的物件檔案先做好排序, 二是join的物件檔案只支援兩個域,三是join支援的key不能包含空格, 而awk的陣列下標字串可以包含空格,從而法1可以支援多個域作為key來合併兩個檔案
nr ( number of record) 經過awk處理的總記錄數
fnr ( file number of recored ) awk處理的當前檔案的記錄數, 想上面的, 當awk在讀b.txt的時候, fnr重新變成0, nr則在a.txt的記錄數上繼續增加
2. 還需要unix2dos/dos2unix麼?
並不是不需要unix2dos/dos2unix, 問題是unix2dos這個工具在我們大多數linux伺服器上根本沒有。 xx: bin, 你給偶的檔案怎麼格式亂亂的啊. 偶bin總不能說, xx你拿ue做一下unix到dos文字的格式轉換吧。其實弄清楚windows與unix文字格式的差異, 及awk處理文字的方式,用一條很簡單的命令就
可以實現unix2dos的功能了。 趕快試試吧:)
awk '' ur_file > ur_file.txt
tr -d '/r' < dosfile.txt > unixfile.txt
3. sed的域
xx: bin,快幫我從日誌裡統計一下昨天每個使用者的消費數
bin: re啊, yygg的日誌裡怎麼沒有記錄消費數這個域啊, 不過記錄的簡訊內容都裡「本條mm元」的字樣。 hoho, 這不好辦了嗎,趕快使用sed來提取出mm吧。
$ head -n 1 down_20090201.log
[00:00:00] |0000000000|0|172.0.0.1|cmd|fee_pass_succ|10660000|15999999999||gdgmcc|gdgmcc|755||1|wx|normal|-nzzzzz2|jpqqq|2|200|0|10660000||1|3030303030303137313136333433373234323639|0000832f08018000|1|歡迎使用中國象棋, 本條2元(不含通訊費),詢95100000|
$ awk -f'|' '' down_20090201.log | sed -n 's/.*|/(.*/)|/(.*/)|.*本條/(.*/)元.*//2 /3/p'
看看是不是把手機號和使用者的消費數列印出來啦~~~
4. 像sql那樣group by / order by
已經在日誌裡提取出了每條記錄的手機號和消費數啦, 但是xx需要的是每個使用者的消費總數哦, 就想sql裡的select sum(xx) .. group by yy 表急, 「瑞士軍刀」awk又該亮相啦~~
假設檔案a.txt裡有使用者的手機號和消費數兩列, 求每個手機號消費總數: awk ' end }' a.txt
有時候,排序是避免不了的, 而且是針對多列排序... 一昏再昏, 而且是對某一列做順序, 對另外一列做逆序... 就像sql裡的select * from xx order by date desc, name
有乙個文字檔案, 第一列是日期格式為'yyyymmdd', 第二列是檔名, 我想首先對第二列按字母順序排序,然後在 這個基礎上對第一列逆序排序。
類似於sql裡的select date, filename from t_name order by filename, date desc;
檔案如下:
20090105 abc.txt
20090105 xyz.txt
20090105 follow.txt
20090113 follow.txt
20090112 abc.txt
經過sort之後, 檔案變成
20090112 abc.txt
20090105 abc.txt
20090113 follow.txt
20090105 follow.txt
20090105 xyz.txt
答案: sort -k2,2 -k1,1nr ur_file
經驗總結 資料預處理經驗總結1
1.對於特徵較多的df,進行資料預處理時需要對每個特徵變數進行相關處理,為了避免混亂,可以df.info 後將輸出複製到sublime,然後在sublime中針對每個特徵變數進行處理方式標註 非python 只是為了展示在sublime中的效果 action type 30697 non null ...
C 經驗總結
1.標準庫的使用過程中,自己一定要注意,不能使用迭代器保留,因為新的stl中,加入了迭代器新的檢測機制,就是為了怕使用者使用的過程中自己將迭代器有意無意的引用了不存在的物件,因此這就要求我們的迭代器物件一定要在訪問的物件之前進行析購,否則你的程式將出錯。這個是c v8.0 中ms 加入新的安全機制,...
面試經驗總結
我從事技術工作,這幾年的面試與被面試總結 先說我去被面試的經驗吧。回答清楚了2個問題,就能順利過關了。1。為什麼要離開上一家公司。2。公司為什麼要僱傭你。問第乙個問題的是hr 或老闆 呵呵 即使你技術過關,hr那裡沒有好的影響,結果是乙個字,難!如何回答呢?hr想推論出你在他的公司能呆多久。這個時候...