天天看点

一道传说中是百度面试的shell试题

【问题】写脚本实现,可以用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&gt;a1.txt        </code><code>#排序,不然会有提示</code>

<code>sort</code> <code>b.txt&gt;b1.txt</code>

<code>comm</code> <code>-23 b1.txt a1.txt &gt;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>&gt;&gt;&gt;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>&gt;&gt;&gt;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>&gt;&gt;&gt;</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>&gt;&gt;&gt;</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>&gt;&gt;&gt; A&amp;B</code>

<code>{</code><code>3</code><code>, </code><code>4</code><code>}    </code><code>#交集</code>

<code>&gt;&gt;&gt; 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