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