我的电话是:
var1="_source.statistics.test1=AAAAA;;;_source.statistics.test2=BBBB;;;_source.statistics.test3=CCCCC"
awk -F ";;;" '{print $1}' <<<$var1 | cut -d= -f2
AAAAA
awk -F ";;;" '{print $2}' <<<$var1 | cut -d= -f2
BBBB
如何仅使用AWK就能获得相同的结果?
答案 0 :(得分:3)
Awk使您可以split
在另一个定界符上的字段。
awk -F ";;;" '{split($1, a, /=/); print a[2] }'
但是,也许更有效的方法是将这种可怕的敌对输入格式转换为更普通的格式,并使用标准工具从中获取。
sed 's/;;;/\
/g' inputfile | ...
答案 1 :(得分:1)
请问您可以尝试在单个awk
中通过使用字段分隔符-F
来设置传递给{{1的每一行)为=
或;
的方法}}。
awk
OR
echo "$var1" | awk -F'=|;' '{print $2}'
AAAAA
echo "$var1" | awk -F'=|;' '{print $6}'
BBBB
考虑到需要变量的这些输出,如果是,则可以echo "$var1" | awk -F"=|;;;" '{print $2}'
AAAAA
echo "$var1" | awk -F"=|;;;" '{print $4}'
BBBB
使用它,并将其值放在数组中,以后可以使用它。恕我直言,这就是为什么构建数组可以节省创建N个变量的时间的原因。
使用sed创建数组:
sed
使用awk创建阵列:
array=( $(echo "$var1" | sed 's/\([^=]*\)=\([^;]*\)\([^=]*\)=\([^;]*\)\(.*\)/\2 \4/' ) )
上面将立即创建一个值分别为array=( $(echo "$var1" | awk -F"=|;;;" '{print $2,$4}') )
和AAAAA
的数组,以获取您可以使用的数组。
BBBB
我已经使用for i in {0..1}; do echo "$i : ${array[$i]}"; done
0 : AAAAA
1 : BBBB
循环来理解它,可以将for
直接用于array[0]
或将AAAAA
用于array[1]
。
答案 2 :(得分:1)
每当您具有name / tag = val输入数据时,创建一个标签-值对数组很有用,因此您可以通过其标签打印或对数据进行其他操作,例如:
$ awk -F';;;|=' '{for (i=1; i<NF; i+=2) f[$i]=$(i+1); print f["_source.statistics.test1"]}' <<<"$var1"
AAAAA
$ awk -F';;;|=' '{for (i=1; i<NF; i+=2) f[$i]=$(i+1); print f["_source.statistics.test3"], f["_source.statistics.test2"]}' <<<"$var1"
CCCCC BBBB