2016-07-28 90 views
2

所以我有一個包含大量行的文本文件。每行是一個沒有間距的長字符串,但是,該行包含多條信息。該程序知道如何區分每行中的重要信息。該程序確定該行的前4個數字/字母與特定儀器一致。這是文本文件的一個小例子部分。查找部分匹配的行

例如文本文件

1002IPU3... 
    POIPIPU2... 
    1435IPU1... 
    1812IPU3... 
    BFTOIPD3... 
    1435IPD2... 

正如你所看到的,也有包含1435這個文本文件,它與特定的儀器重合之內兩行。然而這些線不相同。如果有同一個電臺的重複(即有兩個1435 *電臺),我正在使用的節目無法進行計算。我需要找到一種方法來搜索我的文本文件,並確定是否存在代表文件中站點的部分字符串的任何重複項,以便我可以刪除一個或兩個重複項。如果我可以讓BASH腳本輸出包含重複項的行數以及重複行的內容,我們將不勝感激。我認爲可能有一個簡單的方法來做到這一點,但我一直無法找到任何這樣的例子。感謝您的幫助。

+0

'sort -k1.1,1.4 file.txt | uniq -Dw4'爲你工作? – heemayl

+0

所以我試着你的命令,我得到了'>> $ sort -k1.1,1.4 text.file | uniq -Dw4 \ uniq:非法選項 - D \ 用法:uniq [-c | -d | -u] [-i] [-f fields] [-s chars] [input [output]]'我做錯了什麼?只是好奇,如果你遇到這樣的事情... – Jon

+0

對不起,我還是新來堆棧溢出,有時我的意見看起來很奇怪。當我使用「\」時,只是要注意那是一條新線。 – Jon

回答

0

使用以下Python腳本(使用蟒2.7版本語法)

#!/usr/bin/python 

file_name = "device.txt" 
f1 = open(file_name,'r') 
device = {} 
line_count = 0 
for line in f1: 
     line_count += 1 
     if device.has_key(line[:4]): 
       device[line[:4]] = device[line[:4]] + "," + str(line_count) 
     else: 
       device[line[:4]] = str(line_count) 
f1.close() 
print device 

這裏的腳本讀取每一行的每一行和初始4字符被認爲是設備名,並創建一個鍵值對device與關鍵代表設備名稱和價值,我們查找的字符串(設備名稱)的行號

下將輸出

{'POIP': '2', '1435': '3,6', '1002': '1', '1812': '4', 'BFTO': '5'} 

這可能會幫助你!

+0

對不起,我想我應該指定我想檢查所有不同的可能的重複站,而不僅僅是站1435,所以我要確保在我的實際文件中沒有POIP站或1812站的重複,等等。我實際使用的文件長度超過800行。希望這是有道理的。 – Jon

0

如果你想要做的,如果有重複的(不一定計數或消除它們)的檢測,這將是一個很好的起點:

awk '{ if (++seen[substr($0, 1, 4)] > 1) printf "Duplicates found : %s\n",$0 }' inputfile.txt 

對於這個問題,它是一個很好的起點計數或消除,太,這將只是需要多一點的工作......

0

如果你想重複的次數:

awk '{a[substr($0,1,4)]++} END {for (i in a) {if(a[i]>1) print i": "a[i]}}' test.in 
1435: 2 

或:

{ 
    a[substr($0,1,4)]++   # put prefixes to array and count them 
} 
END {       # in the end 
    for (i in a) {    # go thru all indexes 
    if(a[i]>1) print i": "a[i] # and print out the duplicate prefixes and their counts 
    } 
} 
0

稍微的迂迴的,但這應該與工作

cut -c 1-4 file.txt | sort -u > list 
for i in `cat list`; 
do 
echo -n "$i " 
grep -c ^"$i" file.txt  #This tells you how many occurrences of each 'station' 
done 

然後,你可以做你想做與多次出現的那些什麼的。