合并awk并切成一个命令

时间:2019-03-21 12:41:20

标签: bash awk

我的电话是:

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就能获得相同的结果?

3 个答案:

答案 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