【问题标题】:Sorting lines and removing all but one line based on the last string?根据最后一个字符串对行进行排序并删除除一行之外的所有行?
【发布时间】:2019-10-16 12:02:57
【问题描述】:

为我的问题寻找解决方案我发现了这个帖子:Sorting on the last field of a line

我使用了一些解决方案来使用sedawk 进行排序,它们可以工作,我还需要做的另一件事是根据一行中的最后一个字符串删除除一行之外的所有内容。

例如,我有:

www.site.com/324242_1234
www.site.com/233_1234
www.site.com/45357_1234
www.site.com/6545_2345
www.site.com/5433_2345
www.site.com/87745_456
www.site.com/453209_456
www.site.com/1345_456

需要这个结果:

www.site.com/324242_1234
www.site.com/6545_2345
www.site.com/87745_456

所以我只需要保留一行包含最后一个字符串,在这个例子中,它们用下划线分隔。感谢您的帮助。

【问题讨论】:

  • 如果您展示到目前为止您尝试过的代码并描述您遇到的问题,您将在这里得到更友好的接待和更好的帮助。如果没有代码,您的问题看起来像是请求免费咨询,而在 StackOverflow 上,很多人不喜欢这样。

标签: bash sorting awk sed


【解决方案1】:
$ sort -t_ -u -k2 file

www.site.com/324242_1234
www.site.com/6545_2345
www.site.com/87745_456

假设前面没有下划线。

awk解决办法可以

$ awk -F_ '!a[$NF]++' file

www.site.com/324242_1234
www.site.com/6545_2345
www.site.com/87745_456

说明 设置字段分隔符后,$NF 引用最后一个字段,a[$NF]++ 从零开始计数每个值的出现次数。 !a[$NF]++ 否定该值,因此仅当计数为零时才会为真,这是查看的键值的第一个实例。这个网站有很多这种awk 成语的例子。

【讨论】:

  • 请解释一下神秘的awk脚本
【解决方案2】:

这个怎么样?

cat file | sed -e 's/_/\t/gi' | sort -uk 2,2 | sed -e 's/\t/_/gi'

文件有字符串的地方

【讨论】:

    【解决方案3】:
    awk -F[_/] '{print $NF,$(NF-1),$0}' input_file |sort -r -nk2,1   |awk '!a[$1]++{gsub($1FS$2,"");gsub(/^ /,"");print}'
    www.site.com/87745_456
    www.site.com/6545_2345
    www.site.com/45357_1234
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-12
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多