【問題】寫指令碼實現,可以用shell、perl等。把檔案b中有的,但是檔案a中沒有的所有行,儲存為檔案c,並統計c的行數。
翻譯**話就是,假設有乙個檔案a是:ab
cd檔案b是:ab
現在要求輸出「b有a沒有"的行,即1 2 3 4,然後wc-l一下。
【思路】兩個檔案比較,第一想法就是diff,但是diff 無論是-c還是-y會牽扯進大量的》 < + -不說,而且diff命令是直白對比,即使字母相同但所在行不同,也會被diff記錄。如果再用for in語句然後一項一項對比也不會很清晰的解決這個問題,所以要換個方法。
第二個方法就是comm命令,但是這個命令有乙個前提,就是要sort排序,comm比diff 高明之處在於它只比較內容而不在意是否同一行,但是要注意對比檔案的先後。#comm -12 a b是找"a和b都有"的項,#comm -23 a b就是找"a有而b沒有"。
【解答】perl我不會,我就用shell寫:
12
3
4
5
6
#!/bin/bash
#written by chrischan @ 2016-4-21
sort
a.txt>a1.txt
#排序,不然會有提示
sort
b.txt>b1.txt
comm
-23 b1.txt a1.txt >c.txt
#由於是要找b有a沒有的,就要b寫在前,a寫在後
echo
$(
cat
c.txt|
wc
-l)
其實還有乙個更簡單的,只用一句話:
1
grep
-
v
-x b.txt -f a.txt|
wc
-l
很多書上不寫grep -x -f的意思,這裡補一下:
-f:指定範本檔案,其內容含有乙個或多個範本樣式,讓grep查詢符合範本條件的檔案內容,格式為每列乙個範本樣式。
-x:只顯示全列符合的列。
從乙個題就能輕鬆看出shell的能力級別,用diff死糾纏就是初級,用comm就是中級,而grep就是高階。的確是乙個好題。
【補充】如果考python,求這種類似「你有我沒有」的東西,用set裡面的差集演算法。
1
2
3
4
5
6
7
8
9
10
>>>a
=
>>>b
=
>>>
print
(a
-
b)
set
([
1
,
2
])
#a有b沒有
>>>
print
(a ^ b)
set
([
1
,
2
,
5
,
6
])
#差集的補集
>>> a&b
#交集
>>> a|b
#全集
一道百度面試題
給出乙個整型陣列num,對其中的每個元素,輸出在它左側且比它小的最近元素,要求時間複雜度為o n 例如int num 2無左側最近元素 4左側最近的是2 1沒有 3左側最近的是1.分析 建立乙個棧,然後將陣列中的元素從右至左依次壓入棧中。對每個元素,入棧前先檢查棧頂元素是否比它大,若是的話,則該元素...
一道百度面試題
下面這段 是把中英文混合字串 漢字用兩個位元組表示,特點是第乙個位元組的最高位為1 中的大寫字母轉化為小寫字母,請找出其中的bug,注意各種異常情況。for char piterator szword piterator 0 piterator else if piterator a piterat...
百度一道面試題
我這裡複製的是原話,當然順序是不一定的,很多拿到題目第一反應就是用map,當然可以解決,但是效率不高。還有人覺得應該用演算法 我是沒想到用啥演算法好.還有覺得應該先排序.還有覺得用位圖.bitmap 等等方法!我都覺得麻煩,思維方式就是,從節省時間考慮,從陣列來看,我們都得遍歷一次陣列裡面的元素,那...