首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UNIX -将头添加到每一行的第一列

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

Stack Overflow用户
提问于 2014-03-03 13:10:18
回答 2查看 1.5K关注 0票数 2

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

源文件:

代码语言:javascript
复制
header-1 header-sub1
field1|field2|field3|field4
field5|field6|field7|field8
header-2
field9|field0|fieldA|fieldB

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

输出:

代码语言:javascript
复制
header-1 header-sub1|field1|field2|field3|field4
header-1 header-sub1|field5|field6|field7|field8
header-2|field9|field0|fieldA|fieldB    

我带的shell脚本循环是-

代码语言:javascript
复制
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创建这样的文件?谢谢您的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-03 13:12:34

您可以使用这个awk

代码语言:javascript
复制
$ 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}在其余的行中,首先打印存储的标头。
票数 4
EN

Stack Overflow用户

发布于 2014-03-03 15:51:14

这可能对您有用(GNU sed):

代码语言:javascript
复制
sed -r '/^header/{h;d};G;s/(.*)\n(.*)/\2|\1/' file

header存储在“保持”空间中,并将其插入到non-header行之前。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22147701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档