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

标签 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 来创建这样的文件?预先感谢您的任何建议。

最佳答案

您可以使用此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="|"} 将输出字段分隔符设置为 |
  • /^标题/{h=$0; next} 如果该行以 header 开头,则存储它而不打印。
  • {print h, $0} 在其余行中,首先打印存储的 header 。

关于UNIX - 将标题添加到每行的第一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147701/

相关文章:

linux - 使用 awk 按多列排序

unix - 如何测试是否支持稀疏文件

linux - 通过一个命令或一系列命令访问数据中心中的所有机器

linux - 如何在 Linux 终端中删除 CRLF 字符(回车换行符)?

AWK:如何抑制默认打印

linux - 移动并删除文件夹中所有匹配 grep 的文件

unix split 跳过前 n 行

regex - 如何根据时间间隔获取这些错误/不匹配字符串

linux - Preg 替换 ../../使用 linux 命令 sed 和 xargs

c - 脚本 : insert an additional #include after the last #include in many, 许多文件