web-dev-qa-db-ja.com

CSVファイルの列数をカウントし、11列未満の場合は名前を変更します

CSVファイルの列数を数える必要があります。 11未満の場合は、.badサフィックスを追加してファイルの名前を変更します。私はこれを試しましたが、必要なものが不足しています:

head -1 myfile.csv | sed 's/[^,]//g' | wc -c

ディレクトリ内のすべてのファイルに対してこれを行う必要があります。

3
daniel caceres
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
5
glenn jackman

別の短いawkアプローチ:

for f in *.csv; do 
    awk -F, '{ exit (NF < 11? 0:1) }' "$f" && mv "$f" "${f}.bad"
done

  • NF < 11?-フィールドの数NF11より小さい場合
  • ステートメントmv "$f" "${f}.bad"は、前のawkステートメントがexit 0を返した場合にのみ実行されます(肯定的な評価として)
4
RomanPerekhrest

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-Switches を参照してください。
  • $f=$ARGVファイル名を保存
  • $c=$#F+1列数を取得
  • close ARGVファイルを閉じる
  • rename $f,"$f.bad" if $c<11列数が11未満の場合は名前を変更
0
Sundeep