你好我想问一下如何从变量中获取唯一的字符串。
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
我不知道在循环中可以加入多少文件。 我们不能使用任何临时文件 谢谢
答案 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
。这将解释评论中报告的错误消息。