【问题标题】:Finding location of duplicates from text从文本中查找重复的位置
【发布时间】:2015-04-05 01:53:46
【问题描述】:

我的数据格式如下:

1;string1
2;string2
...
n;stringn

第一列是 id-number,第二列是文本字符串。文本字符串可能包含数字、字母和字符,例如/.()?!。 ID 号等于行号。我试图找出这些文本字符串中的重复项。我希望得到这样的信息:

String of id 1 is duplicated on lines/ids 4,6,7
String of id 2 is duplicated on lines/ids 11,25

到目前为止,我已经使用 awk 命令完成了这项工作:

awk '/String of text/ {print FNR}' targetfile

并手动替换了我文件中每个文本字符串的搜索字符串。由于数据集现在更大,这变得不切实际。是否可以改进我的 Awk 命令,以便它可以自动测试文件中的每个文本字符串与其他字符串并输出到我正在寻找的信息?我虽然为此使用 for 循环,但不知道如何使其工作。

如果有更好的解决方案,我也可以使用除 Awk 之外的其他工具。我的系统是 Ubuntu 14.04。

【问题讨论】:

  • 如果您可以在第二个字段上对文件进行排序,那么任务将变得几乎是微不足道的。
  • 所以如果 string1 在第 4,6,7 行重复,这是否意味着当我们到达第 4 行时,我们需要说 string4 在第 1,6,7 行重复 在第 6 行我们需要说 字符串 6 在第 1,4,7 行重复 ?
  • @DmitriChubarov 所以,如果你这样做,文件将在第二个字段上排序...awk -F';' '{print $2,$1}' OFS=';' file | sort

标签: linux bash ubuntu text awk


【解决方案1】:

把这个(在 cmets 中解释):

{ seen[$2] = seen[$2] $1 " " }               # remember where you saw strings
                                             # as string of numbers

END {                                        # in the end
  for(s in seen) {                           # for all strings you saw
    split(seen[s], nums, " ");               # split apart the line numbers again

    if(length(nums) > 1) {                   # if you saw it more than once
      line = s " is duplicated on lines";    # build the output line
      for(i = 1; i <= length(nums); ++i) {   # with all the line numbers where you 
        line = line " " nums[i]              # saw it
      }
      print line                             # and print the line
    }
  }
}

进入一个文件,比如foo.awk,然后运行awk -F \; -f foo.awk filename

你也可以像这样放在一行:

awk -F \; '{ seen[$2] = seen[$2] $1 " " } END { for(s in seen) { split(seen[s], nums, " "); if(length(nums) > 1) { line = s " is duplicated in lines"; for(i = 1; i <= length(nums); ++i) { line = line " " nums[i] } print line } } }' filename

...但它足够长,我会使用文件来代替。

【讨论】:

    猜你喜欢
    • 2012-11-08
    • 2018-12-12
    • 2012-03-13
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2021-12-04
    • 2017-10-21
    相关资源
    最近更新 更多