CSV 파일에서 조건이 있는 특정 행을 계산하고 삭제하는 방법은 무엇입니까?

CSV 파일에서 조건이 있는 특정 행을 계산하고 삭제하는 방법은 무엇입니까?

다음과 같은 CSV 파일이 있습니다.

id,country
12343,China
23455,Japan
47,Singapore
374,Australia
6572e,United Kingdom
  • 먼저 열 ID 길이가 3보다 큰 행의 총 개수를 계산하고 싶습니다.
  • 다음으로 ID 길이가 5가 아니고 ID에 알파벳 문자가 포함된 행을 삭제하고 싶습니다.
  • 마지막으로 결과를 저장할 새 파일을 만들고 싶습니다.

awk 방법을 시도했지만 다음과 같은 결과를 얻었습니다.

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' myfile
quote> 

다음과 같은 명령을 입력하면:

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' <myfile>

다음이 표시됩니다.

zsh: parse error near `\n'

예상되는 출력은 Mac 터미널과 유사해야 합니다.

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' myfile
4

파일의 모든 변경 사항을 저장합니다.

저는 Linux를 처음 사용하는데 3가지 질문에 대한 전체 명령을 보여주실 수 있나요?

답변1

이건 숙제인 것 같아요!

열 1의 길이가 3보다 큰 행 수를 계산합니다.

awk 'length($1)>3 {c++} END {print c+0}'

첫 번째 열 길이가 5가 아닌 행을 삭제합니다.

awk 'length($1)==5'

열 1의 길이가 5가 아니고 숫자가 아닌 행을 삭제합니다.

awk 'length($1)==5 && $1 !~ /[^0-9]/'

셸을 사용하여 출력을 새 파일로 지정합니다.

편집: 파일은 원래 탭으로 구분된 파일로 보였으며 현재는 CSV로 편집되었습니다. 이는 솔루션이 필요하다는 것을 의미합니다.

awk -F, 'length($1)>3 {c++} END {print c+0}'
awk -F, 'length($1)==5'
awk -F, 'length($1)==5 && $1 !~ /[^0-9]/'

답변2

쉼표로 구분된 첫 번째 필드가 3자를 초과하는 행 수를 계산하려면 제목과 첫 번째 필드의 길이가 4자가 아닌 행을 삭제한 다음 나머지 행 수를 계산합니다.

sed -e '1d' -e '/^[^,]\{4,\},/!d' file | wc -l

d명령은 이전 주소(줄 번호 또는 정규식)로 주소가 지정된 줄을 삭제합니다. 위의 조건이 충족되지 않으면 !d삭제가 시작됩니다.

이 표현식은 ^[^,]\{4,\},줄 시작 부분에서 쉼표가 아닌 4개 이상의 쉼표와 일치합니다.

헤더를 유지하고 결과를 새 파일에 저장하면서 첫 번째 필드의 길이가 정확히 5자리가 아닌 모든 행을 삭제합니다.

sed -e '1b' -e '/^[[:digit:]]\{5\},/!d' file >newfile

b명령을 사용하여 첫 번째 입력 줄의 스크립트 끝으로 분기하고 다음 루프로 점프합니다. 이렇게 하면 헤더 행이 삭제되지 않고 인쇄됩니다.

이 표현식은 ^[[:digit:]]\{5\},줄 시작 부분의 정확히 5자리 숫자와 그 뒤에 쉼표가 오는 것과 일치합니다.

관련 정보