UNIX - 将标头添加到每行的第一列

时间:2014-03-03 13:10:19

标签: unix sed awk

我有一个关于逐行处理UNIX文件的问题。我现在拥有的是这个 -

源文件:

header-1 header-sub1
field1|field2|field3|field4
field5|field6|field7|field8
header-2
field9|field0|fieldA|fieldB

现在我想逐行处理这个文件并生成一个输出文件。标题应附加到每行的第一列,直到找到下一个标题。实质上,输出文件应如下所示:

输出:

header-1 header-sub1|field1|field2|field3|field4
header-1 header-sub1|field5|field6|field7|field8
header-2|field9|field0|fieldA|fieldB    

我和我一起使用的shell脚本循环就是这个 -

while read line 
do
    echo "Line ---> ${line}"
    if [ $line = "header-1" -o $line = "header-2" ]
    then
        first_col=$line
    else
        complete_line=`echo $first_col"|"$line`
        echo "$complete_line" >> out.csv
    fi
done < input.txt

输入文件不应该逐行读取,然后创建一个附加的“完整行”吗?问题是程序会将header-1header-sub1视为两个不同的字段,但它与完整的标题行1不匹配。但我知道它们在同一行,因此它们应被视为单线。或者我可能错过了某处的逻辑和/或语法?

还有什么办法可以用sed或awk创建这样的文件吗?提前感谢任何建议。

2 个答案:

答案 0 :(得分:4)

您可以使用此awk

$ awk 'BEGIN{OFS="|"} /^header/ {h=$0; next} {print h, $0}' file
header-1 header-sub1|field1|field2|field3|field4
header-1 header-sub1|field5|field6|field7|field8
header-2|field9|field0|fieldA|fieldB

解释

  • BEGIN{OFS="|"}将输出字段分隔符设置为|
  • /^header/ {h=$0; next}如果该行以header开头,则将其存储而不打印。
  • {print h, $0}在其余行上,首先打印存储的标题。

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -r '/^header/{h;d};G;s/(.*)\n(.*)/\2|\1/' file

header存储在保留空间中,然后将其插入non-header行之前。