有兩個多行文件,其中一個包含另一個文件內容,現在的需求是要從大的文件裡去掉包含行,問怎麼破,這是今天一個技術群裡有人問的問題,實現這個有其實有很多方法,我先給一個shell的解決方法,我們假設fileone.txt文件包含filetwo.txt內容,shell方法如下:
#!/bin/sh
for i in `cat fileone.txt`
do
if ! grep $i filetwo.txt >/dev/null 2>&1
then
echo $i >>newfile.txt
fi
done
這樣後生成的文件就去掉了filetwo.txt的包含的行,那如果要求兩個文件都包含的行呢,那就在寫一個腳本,如何要合並兩個文件,而且要不能有重復行呢,那就再寫一個腳本,發現隨著需求變化,你不知不覺就整了好幾個腳本,所以在實際工作中需求是多樣的,其實上面說的內容,大家也應該感到熟悉,以上的操作其實就是我們高中學的集合的概念,說到集合,那python裡本身就帶集合的數據類型,可以對集合的數據類型直接操作,那接下來我們來看看如果用python來實現以上的需求:
#!/usr/bin/evn python
def genset(fname):
flist = []
fi = open(fname)
for line in fi:
line = line.strip()
flist.append(line)
fi.close()
return set(flist)
if __name__ == '__main__':
s1 = genset('fileone.txt')
s2 = genset('filetwo.txt')
s3 = s1 - s2
fi = open('newfile.txt','a+')
for li in list(s3):
fi.write(li + '\n')
fi.close()
在python裡集合的類型的這麼使用的,假設我們有集合s和t,基本操作如下:
1、聯合(|),合並s和t形成一個新的集合,新集合的每個元素都屬於s,t的集合的其中之一成員。
2、交接(&),這個很容易理解,就是兩個圓相交的部分,屬於共同擁有的。
3、差補(-),這就是我們例子中用到的,s-t 後的形成的新集合只屬於s而不屬於t,這樣就在s中有t的給去掉了。
4、對稱差分(^),這個形成新的集合成員要麼屬於s,要麼屬於t,但不能同時屬於s和t.
熟練掌握了集合類型大家就可以在工作中靈活運用。
文章出處——python運維技術微信公眾號