【问题标题】:How to delete lines with a duplicate numbers如何删除具有重复数字的行
【发布时间】:2019-08-28 13:46:51
【问题描述】:

我想删除所有末尾有相同数字的行,例如:

输入:

abc 77777
rgtds 77777
aswa 77777
gdf 845
sdf 845
ytn 963
fgnb 963

输出:

abc 77777
gdf 845
ytn 963

注意:具有相同编号的每一行被删除最多,具有相同编号的所有行之一必须保留。

我想将此文本文件转换为我的输出:

输入:

 c:/files/company/aj/psohz.mp4 905
 c:/files/company/rs/oxija.mp4 905
 c:/files/company/nw/kzlkg.mp4 905
 c:/files/company/wn/wpqov.mp4 905
 c:/files/company/qi/jzdjg.mp4 905
 c:/files/company/kq/dadfr..mp4 905
 c:/files/company/kp/xmpye.jpg 7839
 c:/files/company/fx/jszmn.jpg 7839
 c:/files/company/me/plsqx.mp4 7839
 c:/files/company/xm/uswjb.mp4 7839
 c:/files/company/ay/pnnhu.pdf 8636184
 c:/files/company/os/glwou.pdf 8636184
 c:/files/company/px/kucdu.pdf 8636184

输出:

 c:/files/company/kq/dadfr..mp4 905
 c:/files/company/kp/xmpye.jpg 7839
 c:/files/company/ay/pnnhu.pdf 8636184

【问题讨论】:

  • 我有 350000 行这样的
  • 数字相同的行会一直在一起吗,就像你的两个例子一样?
  • 没有任何 2-10 行的数字变化

标签: bash text notepad++


【解决方案1】:

如果相同的数字总是组合在一起,您可以使用uniq(使用来自 GNU coreutils 的版本进行测试):

uniq -f1 input.txt

-f1 表示检查重复性时跳过第一个字段

请注意,它返回每个组的第一个元素,即psohz,而不是您的示例中的dadfr。不清楚您想要每个组的哪个元素,因为您返回了第一组的最后一个元素,但返回了其他组的第一个元素。

如果相同的数字没有组合在一起,请使用sort 将它们组合在一起:

sort -k2 -su input.txt
  • -s 表示稳定,即您将始终获得每个组的第一个元素,但不会按输出中的原始顺序对组进行排序
  • -u 表示独特
  • -k2 表示 在比较中仅使用字段 2

如果您希望每个组的第一个元素与输入中的元素排序相同,您可以使用perl

perl -ane 'print unless $seen{ $F[1] }++' -- input.txt
  • -n逐行读取输入
  • -a 将空格上的输入拆分为 @F 数组
  • 每隔一列保存为%seen 哈希中的一个键。如果您第一次看到一个数字,该行将被打印,但任何后续出现都不会,因为$seen{ $F[1] } 将大于 0,即 true。

【讨论】:

    【解决方案2】:

    如果您知道始终只有两列(即文件名中没有空格)并且具有相同编号的行始终位于同一块中,您可以使用uniq

    $ uniq -f1 infile
     c:/files/company/aj/psohz.mp4 905
     c:/files/company/kp/xmpye.jpg 7839
     c:/files/company/ay/pnnhu.pdf 8636184
    

    -f1 表示在断言唯一性时忽略第一个字段。

    如果您不了解空格,并且文件中的任何位置可能存在相同的数字,您可以使用 awk:

    $ awk '!a[$NF]++' infile
     c:/files/company/aj/psohz.mp4 905
     c:/files/company/kp/xmpye.jpg 7839
     c:/files/company/ay/pnnhu.pdf 8636184
    

    这会计算每行最后一个字段的出现次数,如果在递增之前该数字为零,则打印该行。这是一种简洁的表达方式

    awk '{ if (a[$NF] == 0) { print; a[$NF] += 1 } }' infile
    

    【讨论】:

    • 什么是独特的?我怎样才能下载那个? windows还是linux?
    • @Aliemaditaj 由于您标记了bash,我假设您可以访问外壳,无论是 Linux 还是 Linux 的 Windows 子系统(“Windows 的 Bash”)。 uniq 是一个标准实用程序,是(例如)GNU coreutils 的一部分。
    • 感谢它的工作。如何使用 '!a[$NF]++' infile 将结果保存在文件中?
    • @Aliemaditaj 您可以通过将> newfile 附加到命令来重定向输出。
    猜你喜欢
    • 2021-09-15
    • 2017-08-17
    • 1970-01-01
    • 2014-07-12
    • 2015-05-25
    • 1970-01-01
    • 2017-01-29
    • 2021-06-10
    • 2017-12-23
    相关资源
    最近更新 更多