对行进行排序并根据最后一个字符串删除除一行以外的所有行?

时间:2019-05-30 20:01:28

标签: bash sorting awk sed

在寻找解决问题的方法时,我发现了以下线程: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

因此,我只需要保留包含最后一个字符串的一行,在此示例中,它们由下划线分隔。感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

$ 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习惯用法的例子。

答案 1 :(得分:1)

怎么样?

SELECT USERNAME 
FROM DBA_USERS 
WHERE (LAST_LOGIN IS NULL) 
  AND USERNAME NOT LIKE 'SYS%' 
ORDER BY LAST_LOGIN ASC;

文件中包含字符串的位置

答案 2 :(得分:1)

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