用sed连接两个特定的行
我试图用sed操作一个数据集,这样我就可以成批地操作它,因为数据集具有相同的结构 我的数据集有两行(本例中的第一行是第7行),如下所示:用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
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,它只支持单字符输入记录分隔符,需要做更多的工作
告诉Awk按BEGIN{FS=OFS=“;”}
将输入行拆分为字段代码>并使用
代码>输出(重建线路时)
- 模式
匹配输入行7,并用它执行关联的操作(NR==7
){…}
将第7行(r=$0;getline
包含当前的输入行)存储在变量$0
中,然后读取下一行(r
),此时getline
包含第8行$0
然后从第8行开始删除子字符串sub(/^“”,/,“”)
,只留下,
8-9012
连接第7行和修改后的第8行,通过将连接赋值回$0=r$0
,分配的字符串被$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,它只支持单字符输入记录分隔符,需要做更多的工作
告诉Awk按BEGIN{FS=OFS=“;”}
将输入行拆分为字段代码>并使用
代码>输出(重建线路时)
- 模式
匹配输入行7,并用它执行关联的操作(NR==7
){…}
将第7行(r=$0;getline
包含当前的输入行)存储在变量$0
中,然后读取下一行(r
),此时getline
包含第8行$0
然后从第8行开始删除子字符串sub(/^“”,/,“”)
,只留下,
8-9012
连接第7行和修改后的第8行,通过将连接赋值回$0=r$0
,分配的字符串被$0
拆分为字段重新编码>,并将结果字段合并形成新的
,由输出字段分隔符$0
分隔OFS
- Pattern
是一种常用的速记方式,只需打印手头的记录(可能已修改)1
sed '/^[^"]/{N;s/\n.*,//;}' file
:搜索不以/^[^”]/
开头的行,如果找到:“
:下一行追加到模式空间N
:从第二行删除最后一个s/\n.*,//
之前的所有字符,
sed '/^[^"]/{N;s/\n.*,//;}' file
:搜索不以/^[^”]/
开头的行,如果找到:“
:下一行追加到模式空间N
:从第二行删除最后一个s/\n.*,//
之前的所有字符,