CSVファイルの列数を数える必要があります。 11未満の場合は、.bad
サフィックスを追加してファイルの名前を変更します。私はこれを試しましたが、必要なものが不足しています:
head -1 myfile.csv | sed 's/[^,]//g' | wc -c
ディレクトリ内のすべてのファイルに対してこれを行う必要があります。
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
別の短い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
を返した場合にのみ実行されます(肯定的な評価として)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未満の場合は名前を変更