use*_*178 7 unix sorting variables bash shell
我有一个包含以下空格分隔条目的变量.
variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana"
Run Code Online (Sandbox Code Playgroud)
如何在不排序的情况下删除重复项?
#Something like this.
new_variable="apple lemon papaya avocado grapes mango banana"
Run Code Online (Sandbox Code Playgroud)
我发现某个脚本可以完成删除变量的重复,但会对内容进行排序.
#Not something like this.
new_variable=$(echo "$variable"|tr " " "\n"|sort|uniq|tr "\n" " ")
echo $new_variable
apple avocado banana grapes lemon mango papaya
Run Code Online (Sandbox Code Playgroud)
Sie*_*geX 20
new_variable=$( awk 'BEGIN{RS=ORS=" "}!a[$0]++' <<<$variable );
Run Code Online (Sandbox Code Playgroud)
以下是它的工作原理:
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}}'
Run Code Online (Sandbox Code Playgroud)
得爱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;
Run Code Online (Sandbox Code Playgroud)
此管道版本通过保留原始顺序来工作:
variable=$(echo "$variable" | tr ' ' '\n' | nl | sort -u -k2 | sort -n | cut -f2-)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11029 次 |
| 最近记录: |