【问题标题】:Bash: Remove unique and keep duplicateBash:删除唯一并保持重复
【发布时间】:2018-07-25 21:25:03
【问题描述】:

我有一个包含 100k 行和大约 22 列的大文件。我想删除 第 15 列 中的内容仅出现一次的所有行。据我了解,它的反面是

sort -u file.txt

删除第 15 列中唯一的行后,我想再次打乱所有行,所以没有排序。为此,我会使用

shuf file.txt

生成的文件应仅包含至少有一个重复项(在第 15 列中)但顺序随机的行。

我试图解决 sort -u 但它只整理出唯一的行并丢弃我需要的实际重复项。但是,我不仅需要删除唯一的行,我还想保留重复的每一行,而不仅仅是重复的一个代表。

谢谢。

【问题讨论】:

  • Bash 没有内置的排序功能。 sort 命令由您的操作系统提供,并且因系统而异。检查系统上的man sort 以查看可用的选项。对于您的特定问题,请考虑使用更高级的工具,例如 awkperl 来处理按“列”拆分内容等复杂性。
  • 将您在第 15 列的唯一排序结果重定向到临时文件 grep -vf temp original 以从原始文件中删除唯一行。检查您的 sort 是否支持 --key=KEYDEF 并创建一个 KEYDEF 以在第 15 列排序。
  • 您可以使用uniq -d 获取已排序输入流中的所有重复值。

标签: bash sorting


【解决方案1】:

使用uniq -d 获取所有重复值的列表,然后过滤文件以便仅包含这些行。

awk -F'\t' 'NR==FNR { dup[$0]; next; } 
     $15 in dup' <(awk -F'\t' '{print $15}' file.txt | sort | uniq -d) file.txt > newfile.txt

awk '{print $15}' file.txt | sort | uniq -d 返回第 15 列中所有重复值的列表。

第一个 awk 脚本中的 NR==FNR 行将其转换为关联数组。

第二行处理 file.txt 并打印数组中第 15 列所在的所有行。

【讨论】:

  • 谢谢!它似乎有效,但是对我来说没有意义的一件事。只是为了检查是否删除了所有唯一字符串,我运行了 sort -t$'\t' -k15 -u file.txt > uniq 并且当我检查行数时,它给了我大约 1300 多行仍然包含在我运行你整洁的命令。
  • -k15 应该是 -k15,15。否则表示键是从 15 到结尾的所有字段。
  • 好的!因此,与您的命令相比,当我运行 sort 命令时,现在仍有 600 行作为 uniq 排序。你知道为什么吗?
  • 你能发布一些产生问题的示例输入吗?
  • 某些字段是否有空格? awk 默认使用任何空格作为字段分隔符,如果应该只使用制表符,则使用 -F'\t'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多