查找具有部分匹配的行

Posted

技术标签:

【中文标题】查找具有部分匹配的行【英文标题】:Find lines that have partial matches 【发布时间】:2016-07-28 17:59:26 【问题描述】:

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

示例文本文件

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

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

【问题讨论】:

sort -k1.1,1.4 file.txt | uniq -Dw4 适合你吗? 所以我尝试了你的命令,我得到了>> $ sort -k1.1,1.4 text.file | uniq -Dw4 \ uniq: illegal option -- D \ usage: uniq [-c | -d | -u] [-i] [-f fields] [-s chars] [input [output]] 我做错了什么吗?只是好奇你是否会遇到这样的事情...... 抱歉,我还是 Stack Overflow 的新手,有时我的 cmets 看起来很奇怪。当我使用“\”时,只是要注意这是一个新行。 这意味着你没有使用 GNU uniq 所以除非修改我的解决方案将无法工作.. 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

如果你想要重复的计数:

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】:

有点迂回,但这应该可行-

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

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

【讨论】:

【参考方案4】:

使用以下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'

这可能会帮助你!

【讨论】:

对不起,我想我应该指定我要检查所有不同的可能重复站,而不仅仅是站 1435,所以我想确保在我的实际文件中没有重复站 POIP 或站 1812 等。我实际使用的文件超过 800 行。希望这是有道理的。

以上是关于查找具有部分匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 在两列中查找具有匹配值的行并在另一列中相乘

无论如何,为了提高 SQL 查询的性能,以按标签匹配计数查找具有顺序的行

合并具有部分匹配值的行

在 Table1 中查找与 Table2 中的条件行匹配的行

Pandas - 查找和索引与行序列模式匹配的行

mysql 如何查找同一表中两行之间的差异并列出不匹配的记录? mysql在表中查找不匹配的行