bash - 删除 csv 中超过 X 列的行

标签 bash csv awk text-parsing

我需要删除 csv 文件中列数超过一定数量的所有行。

发生这种情况是因为有时生成 csv 文件的代码会跳过一些值并在同一行打印以下内容。

示例:考虑以下要解析的文件。我想删除所有超过 3 列的行(即标题的列):

timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
3,4,4val2,4val3
5val1,5val2,5val3
6,6val2,6val3

我想要的输出文件是:

timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
5val1,5val2,5val3
6,6val2,6val3

我不关心时间戳为 4 的行是否丢失。

我更喜欢 bash 或 awk 中的解决方案,而不是 python 解决方案,这样我就可以学习如何使用它。

最佳答案

这可以通过 awk 直接完成:

awk -F, 'NF<=3' file

这使用了 awk变量 NF保存当前行中的字段数。由于我们已将字段分隔符设置为逗号(使用 -F, 或等效的 -v FS="," ),因此只需检查字段数何时不超过 3。这是通过 NF<=3 完成的。 : 如果为真,该行将被自动打印。

测试

$ awk -F, 'NF<=3' a
timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
5val1,5val2,5val3
6,6val2,6val3

关于bash - 删除 csv 中超过 X 列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29411952/

相关文章:

awk bash 重复模式

python - 将多个文件附加到一个文件中,跳过第一行并排序

linux - 让 bash 将带有空格的变量作为单个文件名传递给 tar 时出现问题

bash exec 将输出发送到管道,怎么样?

c# - 如何直接从 FTP 文件夹中的流创建和保存文件?

java - List<String> 的列表到字符串有序的字符串数组

perl - 如何使用 perl 解释器转义单引号?

Python 子脚本消耗所有标准输入

PHP 在文件中写入制表符?

matrix - 使用 awk 从表中创建矩阵