【问题标题】:Join two specific lines with sed用 sed 连接两个特定的行
【发布时间】:2017-01-13 17:19:44
【问题描述】:

我正在尝试使用 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 行。任何想法,这可能吗?

【问题讨论】:

  • 顺便说一句:8s/7s/ 不是有效的sed 脚本。

标签: sed


【解决方案1】:

注意:在问题的当前形式中,sed 解决方案是可行的 - 最初不是这种情况,其中 joined 行的最后一个 ;-separated 字段需要转换为整体,提示下面awk解决方案。

按原样连接第 7 行和第 8 行,只需删除它们之间的换行符,就可以使用这个简单的sed 命令来实现:

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 的 cmets 来看,另一个问题是输入中存在 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 分隔,输出字段分隔符。

  • Pattern 1 是一种常见的速记方式,可以简单地打印手头的(可能已修改的)记录。

【讨论】:

  • 您好,感谢您的回复!它几乎可以工作!它还添加了 XXXXXXX。如果它只是被添加到第 7 行并且空格和“-”字符仍然存在,也可以。我可以用 sed 解决这个问题。
  • 感谢您的全面回答!我已经更新了我的问题,我希望它更清楚。第二个中的数字应该添加到第一行的末尾,因为这些数字属于彼此。
  • 我已经尝试过您的新 awk 代码,但结果是 8-9012 替换了 enginenumber。现在我看到'8-9012umber; ABX 105;生产编号。;01 2345 67-'
  • @Donald:听起来您的输入中有 Windows 样式的 CRLF 换行符。
  • 感谢您的努力。不幸的是,它还没有成功。第 8 行仍然插入第 7 行的开头而不是结尾。基本上我只想加入第 7 行和第 8 行。就像 SQL 中的 concat 一样。
【解决方案2】:

使用 sed:

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

【讨论】:

  • 考虑 /pattern/!{N} 使用 bang 表示不匹配
  • @stevesliva sed '/^"/!{N;s/\n.*,//}' 不等于 sed '/^[^"]/N;s/\n.*,//'
  • 我的意思是/"/!{N};s/\n.*,// 我不确定是否需要大括号。我只是碰巧看到你正在研究这个答案,当/[^"]/ 出现时,/"/! 是我的想法。 +1 无论如何
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多