我需要计算 CSV 文件中的列数。如果小于 11,请重命名附加后缀的文件.bad
。我尝试过这个,但它不足以满足我的需要:
head -1 myfile.csv | sed 's/[^,]//g' | wc -c
我需要对目录中的所有文件执行此操作。
答案1
for file in *.csv; do
cols=$( awk -F, 'NR == 1 {print NF; exit}' "$file" )
if [[ "$cols" -lt 11 ]]; then
mv -v "$file" "$file.bad"
fi
done
或者,使用 bash 而不使用 awk
for file in *.csv; do
IFS=, read -ra fields <"$file"
if [[ "${#fields[@]}" -lt 11 ]]; then
mv -v "$file" "$file.bad"
fi
done
答案2
又一个短篇awk
方法:
for f in *.csv; do
awk -F, '{ exit (NF < 11? 0:1) }' "$f" && mv "$f" "${f}.bad"
done
NF < 11?
- 如果字段数量NF
小于11- 仅当前面的语句返回
mv "$f" "${f}.bad"
时才会执行该语句(作为肯定的评估)awk
exit 0
答案3
perl
有改名内置函数(有警告,因此请检查文档)
perl -F, -ane '$f=$ARGV; $c=$#F+1; close ARGV; rename $f,"$f.bad" if $c<11' *.csv
-F,
用作,
字段分隔符,请参阅https://perldoc.perl.org/perlrun.html#命令开关有关其他选项的详细信息$f=$ARGV
保存文件名$c=$#F+1
获取列数close ARGV
关闭文件rename $f,"$f.bad" if $c<11
如果列数小于 11,则重命名