删除csv中包含多于X列的行

时间:2015-04-02 11:34:36

标签: 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的解决方案,以便我可以学习如何使用它。

2 个答案:

答案 0 :(得分:6)

这可以通过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

答案 1 :(得分:1)

尝试以下操作(不要忽略替换文件路径和最大列):

#! /bin/bash

filepath=test.csv
max_columns=3

for line in $(cat $filepath);
do
    count=$(echo "$line" | grep -o "," | wc -l)
    if [ $(($count + 1)) -le $max_columns ]
            then
            echo $line
    fi
done

将其复制到.sh文件中(例如 cropper.sh ),将其设为可执行文件chmod +x cropper.sh并运行./cropper.sh。)

这将仅输出有效行。然后,您可以通过这种方式在文件中捕获结果:

./cropper.sh > result.txt