2016-07-28 51 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 

然后,你可以做你想做与多次出现的那些什么的。