我试图用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行。任何想法都可以吗?
答案 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.*,//
:从第二行,
的字符