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개 미만인 경우 이름을 바꿉니다.

관련 정보