如何通过unix命令将带有键值对的文本文件转换为有序输出

如何通过unix命令将带有键值对的文本文件转换为有序输出

我有一个文本文件,其中包含不同变量的可能值范围

1. life:        short,long,na.
2. weather_f:   cloudy,rainy,sunny,foggy,cold,warm,mild,
                    humid,na.
3. sea_temp:    warm,mild,cold,na.

我想得到一个如下所示的输出文件

short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na

我尝试使用sed此功能,但新的线路weather_f让我遇到了困难。我怎样才能达到预期的输出?

答案1

当一行以逗号结尾时,立即将下一行追加到缓冲区。这是通过sed使用表达式来完成的

/,$/N

N命令将下一行附加到缓冲区中的文本,并使用换行符作为两者之间的分隔符。

要允许多个这样的连续行,请循环回到循环的开头以检查缓冲区末尾是否有逗号。

:again
/,$/ {
    N

    # branch to the "again" label at the top
    b again
}

此后,我们不再需要添加到缓冲区中的行,因此我们可以开始修剪该行并按照我们想要的方式排列它。这包括删除第一个字符之前的所有内容:,删除所有类似空格的字符(包括 插入的换行符N),以及删除末尾的点。

s/[^:]*://
s/[[:space:]]//g
s/\.$//

整个编辑脚本将是

:again
/,$/ {
    N
    b again
}
s/[^:]*://
s/[[:space:]]//g
s/\.$//

这可以使用文件中的脚本(此处为script)来执行,例如

sed -f script file

或者,如果您想在命令行上键入脚本,

sed -e :again \
    -e '/,$/ { N; b again; }' \
    -e 's/[^:]*://' \
    -e 's/[[:space:]]//g' \
    -e 's/\.$//' file

鉴于您问题中的数据,这将输出

short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na

有些sed实现可能需要b again自己的表达:

sed -e :again \
    -e '/,$/ { N' -e 'b again' -e '}' \
    -e 's/[^:]*://' \
    -e 's/[[:space:]]//g' \
    -e 's/\.$//' file

相关内容