如果字段数较少,如何在 csv 中加入行
How to join lines in csv if number of fields is less
我有一个损坏的 csv 文件。字段中有端线(linux 和 windows)。我知道每行中的字段数 N
。例如对于 N=5
field1,field2,field3,field4,field5
field6,field7,fie
ld8,field9,field10
...
假设没有其他例外情况,如何加入(合并?)较小的行以形成具有 N
字段的规则行。我可以将 windows 结尾转换为 tr -d '\r'
但接下来要做什么。
cat fileName | tr -d '\r' | tr -d '\n'> newFile
这会将虚线组合在一起以获得五个字段:
$ awk -F, 'last{[=10=]=last [=10=];} NF<5{last=[=10=];next} {print;last="";}' file
field1,field2,field3,field4,field5
field6,field7,field8,field9,field10
工作原理
awk一次读入一条记录(行),并将行分成字段。目标是根据需要添加 merge/coalesce 行,以确保它们有五个字段。
总结:任何短行都保存在变量last
中并附加到下一行。当一行有五个或更多字段时,打印它。
详情:
-F,
这会将字段分隔符设置为逗号。
last{[=13=]=last [=13=];}
如果上一行少于五个字段,则保存在变量last
中。如果 last
不为空,则添加到当前行的开头。
NF<5{last=[=16=];next}
如果当前行少于五个字段,则保存在last
中并跳转到next
行。
{print;last="";}
如果我们到了这里,那么当前行至少有5个字段。打印出来。将 last
设置为空字符串。
我有一个损坏的 csv 文件。字段中有端线(linux 和 windows)。我知道每行中的字段数 N
。例如对于 N=5
field1,field2,field3,field4,field5
field6,field7,fie
ld8,field9,field10
...
假设没有其他例外情况,如何加入(合并?)较小的行以形成具有 N
字段的规则行。我可以将 windows 结尾转换为 tr -d '\r'
但接下来要做什么。
cat fileName | tr -d '\r' | tr -d '\n'> newFile
这会将虚线组合在一起以获得五个字段:
$ awk -F, 'last{[=10=]=last [=10=];} NF<5{last=[=10=];next} {print;last="";}' file
field1,field2,field3,field4,field5
field6,field7,field8,field9,field10
工作原理
awk一次读入一条记录(行),并将行分成字段。目标是根据需要添加 merge/coalesce 行,以确保它们有五个字段。
总结:任何短行都保存在变量last
中并附加到下一行。当一行有五个或更多字段时,打印它。
详情:
-F,
这会将字段分隔符设置为逗号。
last{[=13=]=last [=13=];}
如果上一行少于五个字段,则保存在变量
last
中。如果last
不为空,则添加到当前行的开头。NF<5{last=[=16=];next}
如果当前行少于五个字段,则保存在
last
中并跳转到next
行。{print;last="";}
如果我们到了这里,那么当前行至少有5个字段。打印出来。将
last
设置为空字符串。