如何从bash中的变量中获取唯一字符串

时间:2015-03-20 22:35:17

标签: bash

你好我想问一下如何从变量中获取唯一的字符串。

while read -r line      
    do
        route=$(echo $line | awk -F'[:]' '{print $2}') #get path from log file
        if [ "`dirname "$route"`" == "`xrealpath "$PWD"`" ]; then #compare path from log file with $PWD
            name=$(echo $line | awk -F'[:]' '{print $1}') #take name from 1st column in log file
        fi
        if ! [ "$name" == "$help_name" ]; then
            echo $name
            help_name=$name
            pom=$pom:$name
        fi
    done < $WEDI_RC

示例日志文件:

proj.sh:/Users/Tom/Documents/proj.sh:2015-03-21:1
proj1.sh:/Users/Tom/Documents/proj.sh:2015-03-21:1
proj.sh:/Users/Tom/Documents/proj.sh:2015-03-21:2
proj1.sh:/Users/Tom/Documents/proj.sh:2015-03-21:2
proj.sh:/Users/Tom/Documents/proj.sh:2015-03-21:3
proj1.sh:/Users/Tom/Documents/proj.sh:2015-03-21:3

我怎样才能回复每一个独特的一次?

我的输出现在看起来像这样:

proj.sh
proj1.sh
proj.sh
proj1.sh
proj.sh
:proj.sh:proj1.sh:proj.sh:proj1.sh:proj.

期待输出:

proj.sh
proj1.sh

我不知道在循环中可以加入多少文件。 我们不能使用任何临时文件 谢谢

1 个答案:

答案 0 :(得分:1)

回答本问题的原始版本

这使用关联数组seen来跟踪已经看到的名称:

declare -A seen
while read -r line    
... blabla ...
do
    if [ -z "${seen[$name]}" ]; then
        echo $name
        seen["$name"]=1
        pom=$pom:$name
    fi
done < "$WEDI_RC"

工作示例(否blabla

让我们从这个文件开始:

$ cat file
proj.sh
proj1.sh
proj.sh
proj1.sh
proj.sh

我们将运行此代码(请注意,...blabla...已被删除,循环现在直接读入name):

$ cat script.sh
declare -A seen
while read -r name
do
    if [ -z "${seen[$name]}" ]; then
        echo $name
        seen["$name"]=1
        pom=$pom:$name
    fi
done < file
declare -p pom

结果如下:

$ bash script.sh
proj.sh
proj1.sh
declare -- pom=":proj.sh:proj1.sh"

回答修订问题

在修订后的问题中,出现以下代码:

    route=$(echo $line | awk -F'[:]' '{print $2}') #get path from log file
    if [ "`dirname "$route"`" == "`xrealpath "$PWD"`" ]; then #compare path from log file with $PWD
        name=$(echo $line | awk -F'[:]' '{print $1}') #take name from 1st column in log file

这意味着,当代码运行时,根据运行脚本时的当前目录,可能永远不会设置name。这将解释评论中报告的错误消息。