gpt4 book ai didi

Linux:如果字符串在列表的其他地方有子字符串,则从列表中删除字符串

转载 作者:太空狗 更新时间:2023-10-29 11:49:37 25 4
gpt4 key购买 nike

我想获取一个字符串列表,并只保留列表中其他地方没有子字符串的字符串。为了说明,我有这个列表:

apple
applesauce
kiwi
mango
mangoes
mangosteen
oranges
pineapples

我想将它缩减为一个字符串列表,列表中的其他地方没有任何子字符串。因此,结果列表将是:

apple
kiwi
mango
oranges

请注意,applesaucepineapples 已被删除,因为 apple 位于列表的其他位置,并且是这两个词的子字符串。

我发现了一个类似的问题here但它似乎专门针对前缀,例如ablaze, able, abler, ablest.基于该方法,我使用列表的预排序副本尝试了以下操作,它只是打印了整个列表,甚至没有删除我认为会删除的applesauce:

awk '$1~r && p in k { next } { k[$1]++; print; r= "^" $1; p=$1 }' fruitsorted.txt

即使它按照我的预期工作,它仍然会在我的列表中错过 pineapple

请注意,在极端情况下,如果列表中的所有字母(我猜是 ASCII 字符集)都在单独的一行中,那么无论列表中还有什么,输出都只是字母表/字符集。

此外,我的起始列表未排序。我真的不在乎结果列表是否排序,尽管这对于 sort 来说显然是微不足道的。

理想情况下,我想要一个稍微紧凑的 shell 命令/序列,例如 grep/sort/awk,而不是更长形式的 Perl/Python/我已经知道如何实现的任何脚本。

谢谢。

更新

正如下面 Ed Morton 所指出的,即使对列表进行排序也可能会搞乱一些基本方法,例如在下面的示例中,假定排序列表的方法可能无法删除 berryplum,因为它的子字符串 plum 紧随其后。 123 显示的第二种方法处理这种情况。

apple
applesauce
berryplum
kiwi
mango
mangoes
mangosteen
oranges
pineapples
plum

最佳答案

如果列表是排序的就很简单

awk '{for(i in a)if(index($0,i))next;a[$0]}1' file

apple
kiwi
mango
oranges

基本上只是为每一行循环一个数组,并检查该行中是否存在元素。如果不是这种情况,则添加到数组。

对于未排序的列表,这应该可以工作

awk '{for(i in a){if(index(i,$0)&&$0!=i)delete a[i];if(index($0,i))next}a[$0];next}
END{for(i in a)print i}' file

测试于 Wordlist性能。

real    0m29.932s
user 0m29.918s
sys 0m0.008s

关于Linux:如果字符串在列表的其他地方有子字符串,则从列表中删除字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44722588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com