计算 CSV 文件中的列数,如果少于 11 列则重命名

计算 CSV 文件中的列数,如果少于 11 列则重命名

我需要计算 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"时才会执行该语句(作为肯定的评估)awkexit 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,则重命名

相关内容