用sed加入两个特定的行

时间:2017-01-12 13:27:21

标签: sed

我试图用sed操作数据集,所以我可以批处理,因为数据集具有相同的结构。

我有一个包含两行的数据集(本例中的第一行是第7行),如下所示:

Enginenumber; ABX 105;Productionnumber.;01 2345 67-
"",,8-9012

我想要的是什么:

Enginenumber; ABX 105;Productionnumber.;01 2345 67-8-9012

所以第二行末尾的数字(8-9012)已添加到第一行的末尾,因为这些数字彼此属于

我尝试过的事情:

sed '8s/7s/' file.csv

但那个不起作用,我认为只会替换整行7. 8-9012部分位于文件的第8行,我希望将该部分添加到第7行。任何想法都可以吗?

2 个答案:

答案 0 :(得分:1)

注意:在问题的当前表单中,sed解决方案是可行的 - 原来并非如此,的最后一个; - 分隔字段已加入< / em>行需要整体转换,这促使了下面的awk解决方案。

通过这个简单的sed命令,只需通过删除它们之间的换行符来连接第7行和第8行

sed '7 { N; s/\n//; }' file.csv

awk解决方案

awk '
 BEGIN { FS = OFS = ";" }
 NR==7 { r = $0; getline; sub(/^"",,/, ""); $0 = r $0 }
 1
' file.csv

根据OP的评论判断,另一个问题是输入中是否存在CRLF行结尾。使用GNU Awk或Mawk,将RS = "\r\n"添加到BEGIN块足以处理此问题(或RS = ORS = "\r\n",如果输出也应具有CRLF行结尾),但使用BSD Awk,它只支持单字符输入记录分隔符,需要做更多的工作。

  • BEGIN { FS = OFS = ";" }告诉Awk将输入行拆分为;字段,并在输出时使用;(重建行时)。

  • 模式NR==7匹配输入第7行,并使用它执行相关操作({...})。

  • r = $0; getline将第7行($0包含手头的输入行)存储在变量r中,然后读取下一行(getline),其中点$0包含 8 行。

  • sub(/^"",,/, "")然后从第8行的开头删除子串"",,,只留下8-9012

  • $0 = r $0加入第7行并修改第8行,通过将连接分配回$0,分配的字符串将按;重新分割为字段,结果字段将被连接以形成新的$0,由OFS分隔,即输出字段分隔符。

  • 模式1是一种常见的简写,只是打印手边的(可能已修改的)记录。

答案 1 :(得分:1)

使用sed:

sed '/^[^"]/{N;s/\n.*,//;}' file
  • /^[^"]/:搜索不以"开头的行,如果找到:
  • N:下一行会附加到模式空间
  • s/\n.*,//:从第二行
  • 删除所有截至,的字符