디렉터리에 여러 개의 CSV 파일이 있습니다. 첫 번째 열에 숫자가 없거나 비어 있는 파일의 이름을 바꾸고 싶습니다. 새 파일 이름은 filename.bad여야 합니다.
이 awk 명령을 시도했지만 작동하지 않습니다.
awk '{ if (! ($1 ~ /[0-9]/)) print $1 }' *.csv .
파일은 다음과 같습니다. 파일 1.csv:
123,ggg,fhghgh,fhgh
345,bla,bla,bla
파일 2.csv:
234,bla,bla,bla
,bla,bla,bla
번호가 누락된 잘못된 파일이므로 이름을 바꾸고 삭제해야 합니다.
답변1
제거하다첫 번째 열에 숫자가 없거나 비어 있는 파일:
단순한grep
방법:
for f in *.csv; do grep -Eq '^(,|[^0-9])' "$f" && rm "$f"; done
답변2
$1
첫 번째 필드의 내용이 포함되어 있지만 파일 이름을 인쇄하고 싶으신 것 같습니다. 또한 기본적으로 awk
필드는 공백으로 구분되는 것으로 간주되지만 필드는 쉼표로 구분됩니다.
awk
쉼표를 구분 기호로 사용하면 GNU awk에는 현재 파일 이름을 포함하는 변수가 -F,
있음을 알 수 있습니다 .FILENAME
$1 !~ /[0-9]/
그런 다음 첫 번째 필드 에 숫자가 포함되지 않은 모든 행을 선택하거나 첫 $1 !~ /^[0-9]+$/
번째 필드가 비어 있거나 숫자로만 구성되지 않은 행을 선택하는 등 첫 번째 필드에 대한 테스트를 추가합니다 . (원하시는 정확한 테스트가 무엇인지 잘 모르겠습니다. 소수점이나 선행 빼기 기호를 허용해야 하는 경우 조정이 필요합니다.)
따라서 GNU awk를 가정하면 다음과 같이 원하는 파일 이름이 인쇄됩니다.
awk -F, '$1 !~ /^[0-9]+$/ { print FILENAME; nextfile}' *.csv
(완전히 빈 줄도 이 작업을 트리거하며 파일 이름에 개행 문자가 포함되어 있으면 작동하지 않습니다.)
그런 다음 루프로 래핑하여 파일 이름을 바꾸거나 삭제합니다.
답변3
어때요?
for f in *csv; do
awk -F, '$1!~/^[0-9][0-9]*$/{exit 1}' "$f" || echo rm -- "$f"
done
awk
입력 파일 줄의 첫 번째(쉼표로 구분된) 필드가 하나 이상의 숫자로 완전히 구성되지 않은 경우 스크립트는 0이 아닌 종료 상태로 종료됩니다. 이는 "왼쪽이 실패하면 오른쪽을 수행"을 의미하므로 종료 상태가 0이 아닌 경우 파일을 ||
실행합니다 . 삭제는 실제로 파일을 삭제합니다.rm
awk
echo
또는 다음을 수행할 수 있습니다.
for f in *csv; do grep -q '^,' "$f" && echo rm -- "$f"; done
따라서 로 시작하는 줄이 있으면 ,
파일을 삭제하세요. 그러나 첫 번째 필드가 숫자가 아닌 행은 누락됩니다. 이것도 원하면 다음을 사용할 수 있습니다.
for f in *csv; do grep -qE '^(,|[^0-9]+),' "$f" && echo rm -- "$f"; done
답변4
다음 명령은 첫 번째 열이 비어 있거나 첫 번째 열에 숫자가 포함되지 않은 파일의 이름을 바꿉니다.
주문하다:
awk -F "," '$1=="" || $1 ~ !”[0-9]” {print "mv" " " FILENAME " " FILENAME".bad"}' * | sh
첫 번째 열이 비어 있거나 첫 번째 열에 숫자가 포함되지 않은 파일을 삭제하려는 경우.
awk -F "," '$1=="" || $1 ~ !”[0-9]” {print “rm -rvf” “ “ FILENAME}’ * | sh