Bash将标头信息附加到文件的每一行,直到找到下一个标头

时间:2017-02-14 07:13:53

标签: bash parsing awk grep header

我有一个文件,其中包含数据标题信息,后跟数据条目。每个标题都不同,我需要将每个标题中的信息添加到文件的每一行,直到遇到下一个标题。例如:

"Header 1","head1_info" date1,data1 date1,data2 "Header 2","head2_info" date3,data5 data4,data6

我希望将此文件追加到:

    `"Header 1","head1_info"
    head1_info,date1,data1
    head1_info,date1,data2
    "Header 2","head2_info"
    head2_info,date3,data5
    head2_info,date4,data6`

我已经尝试将grep分配给变量,但是一旦遇到" Header 2",我就不知道如何让它变为下一个变量。我也一直在试验sed和awk,但我不能让他们做我想做的事。任何指导将不胜感激。

2 个答案:

答案 0 :(得分:0)

假设任何包含双引号的行表示标题行:

awk '/"/{a=$2;gsub("\"","",a); print; next}{print a FS $0}' FS=, input

如果还有其他方法可以确定标题,只需更改开头匹配的模式即可。 (这会在变量a的标题行中记录第2列的值.gsub只删除双引号。)

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r '/^"/h;//!{G;s/(.*)\n.*"(.*)"/\2,\1/}' file

遇到标题行时,将其存储在保留空间中。对于所有其他行,将保留空间附加到模式空间,并使用反向引用替换所需的信息。