删除 csv 中超过 X 列的行
Delete row which has more than X columns in a csv
我需要删除 csv 文件中列数超过一定数量的所有行。
发生这种情况是因为有时生成 csv 文件的代码会跳过一些值并在同一行打印以下内容。
示例:考虑以下要解析的文件。我想删除所有超过 3 列的行(即 header 的列):
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 的解决方案,这样我就可以学习如何使用它。
尝试以下操作(不要忘记替换您的文件路径和最大列):
#! /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
这可以通过 awk
直接完成:
awk -F, 'NF<=3' file
这使用 awk
变量 NF
保存当前行中的字段数。由于我们已经将字段分隔符设置为逗号(使用 -F,
或等价的 -v FS=","
),那么只需要检查字段数何时不超过 3 即可。这样就完成了with NF<=3
: 如果为真,该行将被自动打印。
测试
$ awk -F, 'NF<=3' a
timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
5val1,5val2,5val3
6,6val2,6val3
我需要删除 csv 文件中列数超过一定数量的所有行。
发生这种情况是因为有时生成 csv 文件的代码会跳过一些值并在同一行打印以下内容。
示例:考虑以下要解析的文件。我想删除所有超过 3 列的行(即 header 的列):
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 的解决方案,这样我就可以学习如何使用它。
尝试以下操作(不要忘记替换您的文件路径和最大列):
#! /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
这可以通过 awk
直接完成:
awk -F, 'NF<=3' file
这使用 awk
变量 NF
保存当前行中的字段数。由于我们已经将字段分隔符设置为逗号(使用 -F,
或等价的 -v FS=","
),那么只需要检查字段数何时不超过 3 即可。这样就完成了with NF<=3
: 如果为真,该行将被自动打印。
测试
$ awk -F, 'NF<=3' a
timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
5val1,5val2,5val3
6,6val2,6val3