查找具有部分匹配的行

时间:2016-07-28 17:59:27

标签: bash duplicates

所以我有一个包含大量行的文本文件。每行是一个没有间距的长字符串,但该行包含几条信息。该程序知道如何区分每行中的重要信息。该程序确定该行的前4个数字/字母与特定工具重合。这是文本文件的一个小示例部分。

示例文本文件

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

如您所见,此文本文件中有两行包含1435,与特定工具重合。然而,这些线不相同。如果有相同站点的重复(即,有两个1435 *站点),我使用的程序无法进行计算。我需要找到一种方法来搜索我的文本文件,并确定是否有任何重复的部分字符串代表文件中的工作站,以便我可以删除一个或两个重复项。如果我可以让BASH脚本输出包含重复项的行数以及重复行所说的内容,那将不胜感激。我认为可能有一种简单的方法可以做到这一点,但我还没有找到任何这方面的例子。感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

使用以下Python脚本(使用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'}

这可能会帮助你!!

答案 1 :(得分:0)

如果你想要做的只是检测是否有重复(不一定计算或消除它们),这将是一个很好的起点:

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

就此而言,这是一个很好的计算或消除的起点,它只需要做更多的工作......

答案 2 :(得分: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
  }
}

答案 3 :(得分: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

然后你可以用不止一次出现的那些做任何你想做的事。