bash – 删除变量上的重复项而不进行排序
发布时间:2020-12-16 01:14:44 所属栏目:安全 来源:网络整理
导读:我有一个包含以下空格分隔条目的变量. variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana" 如何在不排序的情况下删除重复项? #Something like this.new_variable="apple lemon papaya avocado grapes mango banana" 我
我有一个包含以下空格分隔条目的变量.
variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana" 如何在不排序的情况下删除重复项? #Something like this. new_variable="apple lemon papaya avocado grapes mango banana" 我发现某个脚本可以完成删除变量的重复,但会对内容进行排序. #Not something like this. new_variable=$(echo "$variable"|tr " " "n"|sort|uniq|tr "n" " ") echo $new_variable apple avocado banana grapes lemon mango papaya new_variable=$( awk 'BEGIN{RS=ORS=" "}!a[$0]++' <<<$variable ); 以下是它的工作原理: RS(输入记录分隔符)设置为空格,以便将$variable中的每个水果视为记录而不是字段.非排序独特的魔法发生在!a [$0].由于awk支持关联数组,因此它使用当前记录($0)作为数组a []的键.如果之前没有看到该键,则[$0]的计算结果为’0′(awk的未设置索引的默认值),然后将其取反以返回TRUE.然后我利用awk默认为’print $0’的事实,如果表达式返回TRUE并且没有给出'{commands}’.最后,然后递增[$0],使得该键不再返回TRUE,因此永远不会打印重复值. ORS(输出记录分隔符)也设置为空格以模仿输入格式. 产生相同输出的该命令的简洁版本如下: awk 'BEGIN{RS=ORS=" "}{ if (a[$0] == 0){ a[$0] += 1; print $0}}' 得爱awk =) 编辑 如果你需要在纯Bash 2.1中这样做,我会建议: #!/bin/bash variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana" temp="$variable" new_variable="${temp%% *}" while [[ "$temp" != ${new_variable##* } ]]; do temp=${temp//${temp%% *} /} new_variable="$new_variable ${temp%% *}" done echo $new_variable; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |