Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 查找部分匹配的行_Bash_Duplicates - Fatal编程技术网

Bash 查找部分匹配的行

Bash 查找部分匹配的行,bash,duplicates,Bash,Duplicates,所以我有一个包含大量行的文本文件。每行都是一个没有间距的长字符串,但是,该行包含多条信息。程序知道如何区分每行中的重要信息。程序确定该行的前4个数字/字母与特定仪器重合。下面是文本文件的一个小示例部分 示例文本文件 1002IPU3... POIPIPU2... 1435IPU1... 1812IPU3... BFTOIPD3... 1435IPD2... 如您所见,此文本文件中有两行包含1435,这与特定的工具一致。然而,这些线并不相同。如果同一个站点存在

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

示例文本文件

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

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

使用以下Python脚本(使用Python 2.7版本的语法)

在这里,脚本读取每一行,每一行的初始4个字符被视为设备名称,并创建一个键值对
device
,其中键表示设备名称,值作为行号,我们在其中找到字符串(设备名称)

以下是输出

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

这可能会帮到你

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

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

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

如果您想要重复计数:

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


有点迂回,但这应该行得通-

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

然后,您可以对多次出现的文件执行任何操作。

排序-k1.1,1.4 file.txt | uniq-Dw4对您有效吗?因此,我尝试了您的命令,得到了
$sort-k1.1,1.4 text.file | uniq-Dw4\uniq:非法选项--D\用法:uniq[-c |-D |-u][-i][f fields][s chars][input[output]]]
我做错什么了吗?我只是好奇你是否会遇到这样的情况……对不起,我对堆栈溢出还是新手,有时我的注释看起来很奇怪。当我使用“\”时,这只是要注意,这是一个新行。这意味着您没有使用GNU
uniq
,因此我的解决方案将无法工作,除非修改..对不起,我想我应该指定我要检查所有不同的可能重复的站点,而不仅仅是站点1435,所以我想确保在我的实际文件中没有重复的POIP站或1812站等。我实际使用的文件超过800行。希望这是有意义的。
{
  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
  }
}
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