다음과 같은 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자리 숫자와 그 뒤에 쉼표가 오는 것과 일치합니다.