我有如下文件:
Personname:Mark
Hobby:chess
Hobby:tennis
Personname:Tom
Hobby:swimming
Hobby:badminton
Hobby:boxing
Hobby:music
Personname:Nick
Hobby:swimming
Personname:fabio
Hobby:swimming
Hobby:badminton
Hobby:boxing
Hobby:music
我需要的是以下格式:
Mark,chess,tennis
Tom,swimming,badminton,badminton,boxing,music
Nick,swimming
fabio,swimming,badminton,badminton,boxing,music
我尝试使用“tr”,但由于字符串名称重复,无法找出正确的逻辑。您能提供建议吗?
答案1
按照 Oli 的建议,用 sh 代替 awk 进行操作:
#!/bin/sh
IFS=:
while read key value; do
if [ "$key" = "Personname" ]; then
printf "\n%s" $value
else
printf ",%s" $value
fi
done < data
答案2
您可以使用 轻松完成此操作awk
。它只会查看每一行。如果是姓名,我们会插入一个换行符并打印姓名,如果不是,我们会插入一个逗号(不带换行符)并打印爱好。
$ awk -F: '$1=="Personname" {printf("\n%s", $2)} $1=="Hobby" {printf(",%s", $2)}' data
Mark,chess,tennis
Tom,swimming,badminton,boxing,music
Nick,swimming
fabio,swimming,badminton,boxing,music
αғsнιη 在评论中的建议将逻辑转换为使用三元条件来决定要写入什么字符串。这很巧妙,但我会明确检查我们是否正在查看 Personname 或 Hobby 行,而不是空白行或不是名为 Personname 的 Hobby。类似这样的操作应该可以做到:
awk -F: '{printf $1=="Personname" ? "\n"$2 : $1=="Hobby" ? ","$2 : ""}' data