将行格式数据转换为列格式

将行格式数据转换为列格式

我有一个这样的数据集:

Name:      Jim Bean
Vice:      Dice
ID:        AFDSDFDSFDSFASFA
LoginTime: 12343314

Name:      Bob Dylon
Vice:      Trumpets
ID:        AFD232SFDSFASFA
LoginTime: 12343314

Name:      Mary Jane
Vice:      Gambling
ID:        EWDSFDSFASFA
LoginTime: 12343314

.....

我需要将其排列成柱状格式。我的第一个想法是使用awk.但我有点卡住了。

标签将始终以相同的顺序出现,并且每组中始终显示相同数量的标签/值对(标题并不重要)。

我的问题是:我该怎么做?

我已经看到暗示该命令rs可能能够执行类似的操作,但它并不是所有系统上的标准。

答案1

您应该将所需的输出与您的问题一起发布。我的猜测是这样的:

$ awk '{ if($2) printf("%s ", $2); else print ""; }' < dataset
Jim Dice AFDSDFDSFDSFASFA 12343314 
Bob Trumpets AFD232SFDSFASFA 12343314 
Mary Gambling EWDSFDSFASFA 12343314

请注意,这是一个非常愚蠢的方法,它根本不验证任何内容。如果您的输入看起来与您发布的内容有任何不同,它可能会崩溃。

答案2

您可以使用 GNU awk 这样做,注意 RS 和 FS 的使用:

<infile awk '{ print $2, $4, $6, $8 }' RS='\n\n' FS=': +|\n' OFS='\t'

如果你想保留标题:

<infile awk 'NR==1 { print $1, $3, $5, $7 } { print $2, $4, $6, $8 }' RS='\n\n' FS=': +|\n' OFS='\t'

假设所有记录都格式化如下,则可以使用 coreutils 执行以下操作:

<infile grep -v '^$' | tr -s ' ' | cut -d' ' -f2- | paste - - - -

输出:

Jim Bean    Dice    AFDSDFDSFDSFASFA    12343314
Bob Dylon   Trumpets    AFD232SFDSFASFA 12343314
Mary Jane   Gambling    EWDSFDSFASFA    12343314

带标题的输出:

Name    Vice    ID      LoginTime
Jim Bean        Dice    AFDSDFDSFDSFASFA        12343314
Bob Dylon       Trumpets        AFD232SFDSFASFA 12343314
Mary Jane       Gambling        EWDSFDSFASFA    12343314

相关内容