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

または、awkの代わりにbashを使用してください。

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#Commandスイッチ他のオプションに関する追加情報
  • $f=$ARGVファイル名の保存
  • $c=$#F+1列数を取得します。
  • close ARGVファイルを閉じる
  • rename $f,"$f.bad" if $c<11列数が11個未満の場合は名前を変更してください。

関連情報