用sed连接两个特定的行

用sed连接两个特定的行,sed,Sed,我试图用sed操作一个数据集,这样我就可以成批地操作它,因为数据集具有相同的结构 我的数据集有两行(本例中的第一行是第7行),如下所示: Enginenumber; ABX 105;Productionnumber.;01 2345 67- "",,8-9012 我想要的是: Enginenumber; ABX 105;Productionnumber.;01 2345 67-8-9012 因此,第二行中的数字(8-9012)被添加到第一行的末尾,因为这些数字彼此属于 我所尝试的: 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行。有什么想法,这可能吗?

注:在问题的当前形式中,
sed
解决方案是可行的-这不是最初的情况,最后一个
-需要整体转换的连接行的分隔字段,这提示了下面的
awk
解决方案

只需删除第7行和第8行之间的换行符,即可按原样连接第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的评论判断,另一个问题是输入中存在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
    是一种常用的速记方式,只需打印手头的记录(可能已修改)


注意:在问题的当前形式中,
sed
解决方案是可行的-这不是最初的情况,最后一个
-需要整体转换的连接行的分隔字段,这提示了下面的
awk
解决方案

只需删除第7行和第8行之间的换行符,即可按原样连接第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的评论判断,另一个问题是输入中存在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
    是一种常用的速记方式,只需打印手头的记录(可能已修改)

使用sed:

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

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

嘿,谢谢你的回复!它几乎起作用了!它还添加了XXXXXXX。如果只将其添加到第7行,并且保留空格和“-”字符,也可以。我可以用sed解决这个问题。谢谢你全面的回答!我已经更新了我的问题,我希望它更清楚。第二行中的数字应该添加到第一行的末尾,因为这些数字彼此属于。我尝试了新的awk代码,但结果是8-9012替换了enginenumber。现在我看到'8-9012号;abx105;产品编号。;01 2345 67-“@Donald:听起来你的输入中有Windows风格的CRLF换行符。谢谢你的努力。不幸的是,它不起作用