如果字段数较少,如何在 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 设置为空字符串。