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