繁体   English   中英

Linux Shell脚本:如何删除单词列表文件中的最终数字?

[英]Linux shell scripting: How can I remove final numbers in a word list file?

我有这个示例列表文本文件( 每行一个单词 ):

John
J0hn
John45
Smith
Sm1th
Jane
Jane333
Doe555

我想获得

John
J0hn
Smith
Sm1th
Jane
Doe

这是:我想删除单词末尾的数字(请注意,单词内部的数字是允许的),然后删除重复项
我有一些编程经验,因此我可以先执行一些循环以检查这些数字,然后执行另一个循环以除去重复的单词,但是我认为Linux Shell必须具有一些简单的命令或参数扩展来解决此问题。为了我。

可以删除原始文件排序 ,但是如果某些方法不需要它,则可以。

可能的用法

  • 隔离密码数据库中使用的单词(John,45John,12345John)以获得多样性统计信息。

欢迎提出想法。 谢谢。

EDIT-1:在这种“字典”文本文件中不会出现空格(无论如何,谢谢你,@ rottweilers_anonymous)。

EDIT-2:添加了一个可能含糊不清的例子,一个只有数字的“单词”:必须留下(我知道,我知道,这不是严格意义上的“单词”;-))。 示例原始文件:

John
J0hn
John45
Smith
Sm1th
Jane
Jane333
Doe555
12345

只要像12345这样的行(没有单词的数字)实际上不是单词number to the end of a word ,我想保留它,所以结果必须是:

John
J0hn
Smith
Sm1th
Jane
Doe
12345

一个简单的方法是使用seduniq

sed "s/\([^0-9]\)[0-9]*\s*$/\1/" file | uniq

这确实假设名称是有序的。 如果不是,则可以使用sort

sed "s/\([^0-9]\)[0-9]*\s*$/\1/" file | sort -u

编辑:根据@rottweilers_anonymous建议,在行尾添加了空格检查。

编辑:根据OP对问题条件的修改,不要从只有数字的行中删除数字。

使用

$ perl -ne '/^\d+$/ or s/\d+$//;$names{$_}++;END{print sort keys %names} ' file

OUTPUT:

12345
Doe
J0hn
Jane
John
Sm1th
Smith

这里的awk行动-这也保留了原有的秩序

awk '/[^[:digit:]]/{sub(/[[:digit:]]+$/, "")};!a[$0]++' file
John
J0hn
Smith
Sm1th
Jane
Doe
12345

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM