발생 횟수를 계산하고 일치하는 값이 있는 행을 삭제합니다.

발생 횟수를 계산하고 일치하는 값이 있는 행을 삭제합니다.

내 문제를 해결하는 데 도움을 받을 수 있나요? 다음과 같은 파일이 있습니다(쉼표로 구분).

A,250,13,820,0,80,201  
B,0,0,0,0,3,0  
C,0,2,1,0,0,0  
D,0,1,105,0,0,10  

5개의 실제 0 값이 있는 행(이 경우 행 B)을 삭제하고 싶습니다. 최종 파일은 다음과 같아야 합니다.

A,250,13,820,0,80,201  
C,0,2,1,0,0,0  
D,0,1,105,0,0,10

모든 0이 항상 고려되기 때문에 코드를 작성하는 데 문제가 있습니다 awk(각 행에는 5개의 0 값이 있지만 행 B에만 5개의 ​​실제 0이 있습니다). 스크립트가 있으면 더 쉬울까요 perl?

답변1

Perl이 구출하러 옵니다!

perl -aF, -ne 'print unless 5 == grep /^0$/, @F;' < input > output
  • -n입력을 한 줄씩 읽습니다.
  • -a각 행을 @F 배열로 분할
  • -F분할 방법 지정(이 경우 쉼표)
  • grep적중 수를 반환하기 위해 스칼라 컨텍스트에서 사용됩니다.

답변2

awk를 사용하세요

awk -F, '{z=0; for (i=2; i<=NF; i++) if ($i == 0) z++} z != 5' file > newfile

답변3

0파일에 it 으로 시작하는 다른 숫자가 없고 0첫 번째 필드가 예제의 숫자가 아닌 경우 다음을 수행할 수 있습니다.

sed -ne 's/,0//5;t' -e p < input > output

다음과 같은 항목은 제거됩니다.적어도5개의 0.

샘플을 다시 사용하여 다음을 수행합니다.

grep ',.*[1-9].*,.*[1-9]'

동일한 작업을 수행합니다(첫 번째 필드 다음에 0이 아닌 두 개의 필드 검색).

답변4

awk 'gsub(/,0/, ",0", $0) != 5' data.input

관련 정보