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