Bash 对文件中的多个重复字符串进行排序

Bash 对文件中的多个重复字符串进行排序

我有如下文件:

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

相关内容