我对用逗号分隔的文本文件有疑问,当我要开始接收具有混合布局的文件(数百个)时,一些记录将有 7 个字段(总共 6 个逗号)和其他记录在同一个文件中将有 6 个字段(共 5 个逗号)。
当我找到一条包含 5 个逗号的记录时,我想在该记录的末尾添加一个逗号,后跟 NA,因此我的加载过程认为它有 7 个字段,即最后一个 NA。
这就是我现在所拥有的,第一条记录有 7 个字段,第二条只有 6 个:
200000003183000100,Data,NA,0,IN,0,0.00
200000004625000000,Data,NA,0,IN,0
这是我所期望的(两条记录都有 7 个字段)
200000003183000100,Data,NA,0,IN,0,0.00
200000004625000000,Data,NA,0,IN,0,NA
这可以用 sed 或类似的东西计算逗号并在文件末尾添加,NA 只要只有 5 个逗号。请记住,这将发生在数百个文件中,所以我不知道是否需要使用文件名作为参数等等。
如果允许awk :
类似于Gilles Quenot 的 answer,但将新字段添加为新字段而不是当前行末尾的字符串。此外,允许在命令行上配置分隔符和预期的字段数,并将用字符串填充缺失的字段
NA
:这显然假设输入是简单的 CSV格式(不包含嵌入逗号或换行符的字段)。
与
sed
:Posix sed
,我们尝试更改第 6 个逗号,如果成功,我们打印并返回读取下一条记录(测试命令t)否则,将,NA
字符串附加到当前记录的末尾。使用
awk
,一种方法是:当您需要对多个文件执行此操作时的用例是通过
find
命令。假设您的 CSV 文件已命名
*.csv
对于 awk,如果您的 awk 支持,请使用 inplace 选项(GNU awk 版本 4.1.0 以上)
符号{} +将多个文件名汇集到 awk 或 sed 命令行,以便最小化这些实用程序的调用
笔记:
为了提高 awk 的效率,除非必须,否则不要修改记录 (
$0
) 或字段 ($1
,等)。$2
这不会修改它们中的任何一个:其他现有的 awk 答案要么修改 $0 要么修改字段,其中任何一个都会减慢处理速度。
这些直接更改 $0 (因此间接添加一个字段):
这需要 awk 找到新的内存以便
$0
移动,因为它的大小增加了(连接或以其他方式更改变量的大小是 awk 中最慢的操作之一)并导致 awk 重新拆分$0
为字段。这些直接更改字段(因此间接更改 $0):
这会导致 awk 从它的字段中重建,并且由于它的大小增加
$0
,再次需要 awk 找到要移动的新内存$0
要使用 GNU awk 在数百个(但少于 ARG_MAX 的)CSV 文件上运行任何 awk 脚本,只需:
或使用任何 awk: