【问题标题】:Delete row which has more than X columns in a csv删除csv中超过X列的行
【发布时间】:2015-06-07 08:22:43
【问题描述】:

我需要删除 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 解决方案,这样我就可以学习如何使用它。

【问题讨论】:

  • 您尝试过自己解决吗?

标签: bash csv awk text-parsing


【解决方案1】:

这可以通过awk 直接完成:

awk -F, 'NF<=3' file

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

测试

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

【讨论】:

  • 这是一个漂亮且更智能的解决方案,您可以使用它来代替我的解决方案。
  • 非常感谢。只是为了好奇,如果我只想要正好有 3 列的行怎么办?我试过了,我不能简单地将 '
  • @Paolo 你做得很好! awk -F, 'NF==3' file 是要走的路。
【解决方案2】:

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

#! /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 &gt; result.txt

【讨论】:

  • 非常感谢您的回复和您的宝贵时间!
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多