我有一个文件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语句中引起问题
答案 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)
您可以使用
避免使用awklastheader=""
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模式-v
选项将shell变量作为awk变量传递给awk 但是,如所示,只需要通过文件一次:不需要shell循环或使用cut
。