awk的搜索模式中的变量

时间:2015-03-14 07:04:53

标签: bash awk

我有一个文件env_prop,如下所示

Generic|HOSTNAME|UKLOSOLD
Generic|FileServerPort|42501
Generic|HubPort|45203
mlc|murexnetport|45204
mlc|DatabaseName|PX_abc02
Replicate|ReplicateForm|pxabc01
Replicate|ReplicateTo|hxxyz02

我希望我的输出应该如下所示,从字段1中唯一排序

****  Generic Parameters  ****

HOSTNAME                  UKLOSOLD                      
FileServerPort            42501                         
HubPort                   45203                         

****  mlc Parameters  ****

murexnetport              45204                         
DatabaseName              px_abc02                    

****  Replicate Parameters  ****

ReplicateForm             pxabc01                      
ReplicateTo               hxxyz02 

但我的编程没有提供所需的结果,请你帮忙吗

for val in `cat env_prop|cut -d'|' -f1|uniq`
do
echo "****  ${val} Parameters  ****"
printf "\n"
awk -F"|" "/$val/ {printf "%-25s %-30s\n", $2 , $3}" env_prop
printf "\n"
done

在printf部分的awk语句中引起问题

3 个答案:

答案 0 :(得分:1)

使用awk

awk -F '\\|' '{a[$1]=sprintf("%s%s%-25s %-30s", a[$1], ORS, $2, $3)} END {
    for (i in a) printf ORS "****  %s Parameters  ****%s%s" ORS, i, ORS, a[i]}' file

****  Replicate Parameters  ****

ReplicateForm             pxabc01
ReplicateTo               hxxyz02

****  Generic Parameters  ****

HOSTNAME                  UKLOSOLD
FileServerPort            42501
HubPort                   45203

****  mlc Parameters  ****

murexnetport              45204
DatabaseName              PX_abc02

答案 1 :(得分:0)

您可以使用

避免使用awk
lastheader=""
while IFS=\| read header key value; do
        if [ -z "${value}" ]; then
                continue
        fi
        if [ "${header}" != "${lastheader}" ]; then
                if [ -n "${lastheader}" ]; then
                        echo
                fi
                printf "**** %s Parameters ****\n\n" "${header}"
                lastheader="${header}"
        fi
        printf "%-20s %s\n" "$key" "$value"
done < env_prop

编辑:删除cat env_prop |,替换为&lt; env_prop

答案 2 :(得分:0)

这将保持文件的顺序:

awk -F'|' '
  $1 != prev {print "\n****  " $1 " parameters ****\n"; prev = $1}
  {printf "%-25s%s\n", $2, $3}
' file
****  Generic parameters ****

HOSTNAME            UKLOSOLD
FileServerPort      42501
HubPort             45203

****  mlc parameters ****

murexnetport        45204
DatabaseName        PX_abc02

****  Replicate parameters ****

ReplicateForm       pxabc01
ReplicateTo         hxxyz02

你正在做的事情的问题:使用awk正文的双引号将允许shell替换 $2$3

awk -F"|" "/$val/ {printf "%-25s %-30s\n", $2 , $3}" env_prop

你想要:

awk -F"|" -v patt="^${val}$" '$1 ~ patt {printf "%-25s %-30s\n", $2 , $3}'
  • ~运算符匹配的awk模式
  • awk身体周围的单引号
  • -v选项将shell变量作为awk变量传递给awk

但是,如所示,只需要通过文件一次:不需要shell循环或使用cut