【問題】寫腳本實作,可以用shell、perl等。把檔案b中有的,但是檔案a中沒有的所有行,儲存為檔案c,并統計c的行數。
翻譯成人話就是,假設有一個檔案a是:
a
b
c
d
檔案b是:
1
2
3
4
現在要求輸出“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寫:
5
6
<code>#!/bin/bash</code>
<code>#written by ChrisChan @ 2016-4-21</code>
<code>sort</code> <code>a.txt>a1.txt </code><code>#排序,不然會有提示</code>
<code>sort</code> <code>b.txt>b1.txt</code>
<code>comm</code> <code>-23 b1.txt a1.txt >c.txt </code><code>#由于是要找b有a沒有的,就要b寫在前,a寫在後</code>
<code>echo</code> <code>$(</code><code>cat</code> <code>c.txt|</code><code>wc</code> <code>-l)</code>
其實還有一個更簡單的,隻用一句話:
<code>grep</code> <code>-</code><code>v</code> <code>-x b.txt -f a.txt|</code><code>wc</code> <code>-l</code>
很多書上不寫grep -x -f的意思,這裡補一下:
-f:指定範本檔案,其内容含有一個或多個範本樣式,讓grep查找符合範本條件的檔案内容,格式為每列一個範本樣式。
-x:隻顯示全列符合的列。
從一個題就能輕松看出shell的能力級别,用diff死糾纏就是初級,用comm就是中級,而grep就是進階。的确是一個好題。
【補充】如果考python,求這種類似“你有我沒有”的東西,用set裡面的差集算法。
7
8
9
10
<code>>>>A</code><code>=</code><code>{</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>}</code>
<code>>>>B</code><code>=</code><code>{</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>,</code><code>6</code><code>}</code>
<code>>>></code><code>print</code><code>(A</code><code>-</code><code>B)</code>
<code>set</code><code>([</code><code>1</code><code>,</code><code>2</code><code>]) </code><code>#A有B沒有</code>
<code>>>></code><code>print</code><code>(A ^ B)</code>
<code>set</code><code>([</code><code>1</code><code>,</code><code>2</code><code>,</code><code>5</code><code>,</code><code>6</code><code>]) </code><code>#差集的補集</code>
<code>>>> A&B</code>
<code>{</code><code>3</code><code>, </code><code>4</code><code>} </code><code>#交集</code>
<code>>>> A|B</code>
<code>{</code><code>1</code><code>, </code><code>2</code><code>, </code><code>3</code><code>, </code><code>4</code><code>, </code><code>5</code><code>, </code><code>6</code><code>} </code><code>#全集</code>
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1766450