Linux shell脚本编程-将一行中的某个部分去重

一,背景。


今天遇到了一个使用场景,获取文件中每一行的某个属性数据,然后将该属性数据去重。

二,shell脚本编写。


bash
1 #!/bin/bash
2 for line in `cat test1|awk -F "|" '{print $4}'|awk -F "[" '{print $2}'|awk -F "\]" '{print $1}'`
3 do
4 echo "line"$line
6 str=`echo $line|awk -F "," '{for(i=1;i<=NF;i++) {if(!a[$i]++) {printf("%s", $i); if(i != NF) {printf(",")} } } }'`
7 echo $str
8 # echo "new Line"$str
9 # len=${#str}
10 #
11 # echo "len : "$len
12 # if [ "${str: -1}" == "," ];then
13 # str=${str:0:$len-1}
14 # fi
15 # echo $str
16 done

三,分析。


1,获取想要的属性数据,以”|”为分隔符获取第四个数据然后再获取”[]”中的数据。

cat test1|awk -F "|" '{print $4}'|awk -F "[" '{print $2}'|awk -F "\]" '{print $1}
2,数据去重。以”,”作为分割, 遍历整个数组,去除重复的字符串。
echo $line|awk -F "," '{for(i=1;i<=NF;i++) {if(!a[$i]++) {printf("%s", $i); if(i != NF) {printf(",")} } } }
其中有一个去除重复项最为关键的点: !a[$i]++ 这里有使用到hash数组。将遍历的字符串以key和value都为字符串变量的值存入到hash数组中,然后判断是否存在,如果不存在就但打印这个变量,然后打印换行符。

四,待改进点。


1,遇到了一个问题, 每行要去重的数据,如果$NF不是唯一的变量,会使得打印出来的字符串少一个,反之则会多一个,被注释掉的内容是打算实现将字段串判断最后一个字符是不是’,’,如果是就截断字符串。但是未能实现。

你可能感兴趣的:(linux)