使用bash和命令在制表符分隔的文件中检测“重复”条目

我有一个制表符分隔的文本文件,我需要检查是否重复。布局看起来大致如此。 (文件中的第一项是列名。)
输入文件样本:

+--------+-----------+--------+------------+-------------+----------+
| First  |   Last    | BookID |   Title    | PublisherID | AuthorID |
+--------+-----------+--------+------------+-------------+----------+
| James  | Joyce     |     37 | Ulysses    |         344 |     1022 |
| Ernest | Hemingway |    733 | Old Man... |         887 |      387 |
| James  | Joyce     |    872 | Dubliners  |         405 |     1022 |
| Name1  | Surname1  |      1 | Title1     |           1 |        1 |
| James  | Joyce     |     37 | Ulysses    |         345 |     1022 |
| Name1  | Surname1  |      1 | Title1     |           2 |        1 |
+--------+-----------+--------+------------+-------------+----------+

文件最多可容纳50万行。我们要做的是检查BookID和AuthorID值是否重复。因此,例如,在上表中,没有书ID为37,作者ID为1022的两行。

可能,但不能保证,作者将按连续的行分组。如果不是这样,并且检查起来太棘手,我可以接受。但是否则,如果作者相同,我们需要知道是否存在重复的BookID。

一个复杂的问题-文件中可以有重复的BookID,但是不允许使用AuthorID + BookID的组合。

在bash脚本中是否有一种检查此问题的好方法,也许是sedawk的组合,或者是另一种实现此目的的方法?

用于脚本编写的原始制表符分隔文件内容:

First   Last    BookID  Title   PublisherID AuthorID
James   Joyce   37  Ulysses 344 1022
Ernest  Hemingway   733 Old Man...  887 387
James   Joyce   872 Dubliners   405 1022
Name1   Surname1    1   Title1  1   1
James   Joyce   37  Ulysses 345 1022
Name1   Surname1    1   Title1  2   1
shuojie 回答:使用bash和命令在制表符分隔的文件中检测“重复”条目

如果您要查找并计算重复项,可以使用

['/home/folder/image.JPG']

将组合计数保存在关联数组中,如果大于1,则打印计数

,
  

制表符分隔的文本文件

     

正在检查是否没有BookID和AuthorID值的重复

然后从@ piotr.wittchen回答这些列,如下所示:

  

最后一个BookID标题PublisherID AuthorID

很简单:

  • 提取BookID的AuthorID列
  • 排序
  • 检查重复项

cut -f3,6 input_file.txt | sort | uniq -d

如果您需要整行,我们必须对字段进行重新排序,以使uniq能够吃到它们:

awk '{print $1,$2,$4,$5,$3,$6}' input_file.txt | sort -k5 -k6 | uniq -d -f4

如果要按初始顺序排列它们,则可以对行编号,获取重复的行,然后用行号对它们进行重新排序,然后删除行号,如下所示:

nl -w1 input_file.txt |
awk '{print $1,$6,$7}' input_file.txt | sort -k6 -k7 | uniq -d -f5 |
sort -k1 | cut -f2-
,

正如@Cyrus在评论中已经说过的那样,您的问题并不十分清楚,但是看起来很有趣,我试图理解它并提供一些假设的解决方案。

假设我们有以下 void run() override { ... clearVector(); emit progressChanged(id,tim.elapsed() + 100); } 文件:

records.txt

我们将删除行,这些行同时复制了First Last BookID Title PublisherID AuthorID James Joyce 37 Ulysses 344 1022 Ernest Hemingway 733 Old Man... 887 387 James Joyce 872 Dubliners 405 1022 Name1 Surname1 1 Title1 1 1 James Joyce 37 Ulysses 345 1022 Name1 Surname1 1 Title1 2 1 (第3列)和BookID(第6列)的值。我们假设AuthorIDFirstLast也是相同的,我们不必考虑它,并且Title可以不同也可以相同(没关系)。记录在文件中的位置无关紧要(重复的行不必分组在一起)。

牢记这些假设,以上提供的输入的预期输出如下:

PublisherID

删除了同一位作者与一位出版商的同一本书的重复记录。

这是我在Bash中解决此问题的方法

Ernest  Hemingway   733         Old Man...      887             387
James   Joyce       872         Dubliners       405             1022
James   Joyce       37          Ulysses         344             1022
Name1   Surname1    1           Title1          1               1

这可能不是最好的解决方案,但是它可行。

此致

自拍

,

这对于awk非常简单:

$ awk 'BEGIN { FS = "\t" }
       ($3,$6) in seen { printf("Line %d is a duplicate of line %d\n",NR,seen[$3,$6]); next }
       { seen[$3,$6] = NR }' input.tsv

它将每个bookid,authorid对保存在哈希表中,并警告该对是否已存在。

本文链接:https://www.f2er.com/3127498.html

大家都在问