쉘 스크립트 또는 awk 스크립트는 첫 번째 열/필드가 비어 있는 파일을 삭제합니다.

쉘 스크립트 또는 awk 스크립트는 첫 번째 열/필드가 비어 있는 파일을 삭제합니다.

디렉터리에 여러 개의 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이 아닌 경우 파일을 ||실행합니다 . 삭제는 실제로 파일을 삭제합니다.rmawkecho

또는 다음을 수행할 수 있습니다.

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

관련 정보