1. 顯示乙個檔案的第2000-5000行。
命令:
cat file | head -n 5000 | tail -n +2000 顯示2000行到5000行
解析:
tail -n +2000 表示的是從2000行開始顯示;
tail -n 2000 表示的是顯示檔案最後2000行,差別很大,注意靈活使用。
務必注意:head與tail的前後順序。2. 將當前目錄下以".log"結尾且修改時間大於90天的5g以上的大檔案刪除。如果將tail 放前面,如下命令:
cat file | tail -n +2000 | head -n 5000
表示的是 : 從第2000行開始,共顯示5000行,也就是2000~6999行!
命令:
find ./ -name "*.log" -type f -mtime +90 -size +10g -maxdepth 1 -print -exec rm {} \;
解析:
3. 有兩個檔案a和b,如下所示,請統計兩個檔案的交集、差集。
檔案a 檔案b命令:1 12 4
1 23 5
4 62 1
方法1 : 使用comm實現,配合sort和uniq命令
# 交集
comm -12 <
(sort a|uniq)
<
(sort b|uniq)
# 差集:a-b
comm -23 <
(sort a|uniq)
<
(sort b|uniq)
# 差集:b-a
comm -13 <
(sort a|uniq)
<
(sort b|uniq)
方法2:使用grep實現,結合 引數-vff
# 交集
grep -ff a b|sort|uniq
# 差集:a-b
grep -vff b a
# 差集:b-a
grep -vff a b
解析:
comm命令
"comm缺點:待比較檔案需要先(sort|uniq)預處理
grep命令
grep缺點:需要先對每個檔案進行空行刪除處理
4.有下面乙個檔案,請統計每行中每個元素出現的次數並按指定格式輸出:
檔案內容:a a a b
b b c c c
d d d
輸出格式:命令:a:3 b:1
b:2 c:3
d:3
cat
file
|awk -f' '
''
解析:
該命令的主體是乙個awk語句:awk -f' ' '{}'
, 其中,-f指定每行的分隔符, '{}'是每行要執行的命令。
需要提醒的是awk、grep、sed這些文字處理命令,都是按行遍歷處理的。
首先我們提取awk核心語句'{}'
中的內容:
根據分號提示,我們可以將其分為四個部分:
delete a;
先不管這個,看下乙個
遍歷每行每個列元素,把每個列元素出現的次數記錄下來。
for(i=1;i<=nf;i++) a[
$i]++;
其中,nf表示每行的總列數,、$i是該列具體內容
a[$i]++是建立乙個陣列(字典),其中,key為$i, value為$i的出現次數。
通過for迴圈,遍歷每行的每個列,將各個列的出現次數進行了彙總求和。
每行統計完之後,列印統計陣列a
for(i in a)
printf i":"a[i]
"\t"
;
通過for迴圈,逐個列印該行統計字典a的每個item。
printf 是格式化輸出,列印完不回車。
該行統計結束後,最後要列印乙個回車符,然後繼續下一行的統計。
printf
"\n"
那麼問題來了,此時是不是應該將陣列a中的元素清除??想一想,如果不清楚a的話,遍歷後面行的時候,每個item會在前面統計次數的結果上繼續累加!
也就是我們上面跳過的第1步 :deleta a;
它的作用是:
每行開始統計前,都要清空上一行的統計陣列a的內容,新行的統計結果會放到空的a中。
5.有乙個檔案如下,請統計每個廣告商的展示廣告總數和成單總數。
檔案內容:advertiserid:0001 displaynum:100 ordernum:2
advertiserid:0001 displaynum:300 ordernum:4
advertiserid:0003 displaynum:500 ordernum:12
advertiserid:0004 displaynum:200 ordernum:8
輸出格式:命令:(雖然有點長,但是邏輯很清晰,請看解析拆解)0001 400 6
0003 500 12
0004 200 8
cat
file
|awk''|
awk' end'
解析:
該命令主要由兩個awk語句通過管道連線組成,對每個awk分別講解:
(1)第乙個awk:將所需要的字段匹配列印出來
通過執行第乙個awk語句,可以輸出下列格式:
0001 100 20001 300 4
0003 500 12
0004 200 8
awk
''
該部分的主體是兩個函式:match匹配函式和print函式。
match函式部分
格式:match(string,regex,array)
引數介紹
:
string是要匹配的字串
regex是正規表示式
array是匹配出內容的儲存陣列
因此,回到我們的match匹配例子。
match($0,/advertiserid:([0-9]*) displaynum:([0-9]*) ordernum:(.*)/,a);
第1個引數我們使用$0,也就是一整行。
第2個引數是乙個匹配表示式:
/advertiserid:(
[0-9]*) displaynum:(
[0-9]*) ordernum:(.*)/
表示式需要兩個「/」作為start和end標誌,後續需要用到的item需要用()括起來。
第3個引數是乙個陣列名稱,我們用a表示,這樣陣列a就可以將前面的三個()裡面的item存下來了。
print部分
print a[1],a[2],a[3];
這個語句的作用就是:將每行統計陣列a中的各個統計項列印出來。
總結:第乙個awk的作用是將我們需要的字段匹配出來,並統計好,列印出來。
(2)第二個awk:根據advertiserid彙總各行
首先,重申一下第乙個awk執行完之後的輸出結果:
0001 100 2第二個awk的內容是:0001 300 4
0003 500 12
0004 200 8
awk
' end'
主要包括兩個部分: 每行執行語句和end{}結束語句。
每行執行語句
這裡,可以把 a 理解為乙個python字典,key是廣告商id,也就是第乙個awk執行後輸出結果的$1。
value是乙個陣列,儲存兩個資料:
因此,通過執行上面的語句,可以將每個廣告商的廣告展示數和成單數進行彙總。
注意:end{}結束語句本題和第一題不同的是,不用再執行每一行時,清空a中的元素,因為本題是對所有行進行廣告商維度的匯**計,而不是統計完每行都要彙總一下。
end{}語句的執行時機是:awk對所有的行遍歷彙總完之後,彙總結果保留在字典a中。
通過執行下面語句,可以將彙總字典a中的各項內容清晰列印出來:
end
其中,i是廣告商id,a[i][0]是該廣告商的廣告展示數,a[i][1]是成單數。 微軟面試題 1
題 編寫反轉字串的程式,要求優化速度 優化空間。分析 構建兩個迭代器p 和 q 在一次遍歷中,p的位置從字串開頭向中間前進,q從字串末尾向中間後退,反轉字串只要每次遍歷都交換p和q所指向的內容即可,直到p和q在中間相遇,這時迴圈次數剛好等於 字串的長度 2。實現 view plain author ...
陣列 面試題1
面試題 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。分析思路 因為每一行從左到右是遞增,從上到下是遞減的,從左下角元素開始判斷,如果大於指定的元素,則向上,如果小於,則向右 pu...
邏輯面試題(1)
兩人玩遊戲,在腦門上貼數字 正整數 1 只看見對方的,看不見自己的,而且兩人的數字相差1,以下是兩人的對話 a 我不知道 b 我也不知道 a 我知道了 b 我也知道了 問a頭上的字是多少,b頭上的字是多少 一開始兩個人都能看到對方頭上的數字,所以心裡肯定是由兩個備份答案的。第一輪a說不知道,b也說不...