Perl/Shell에서 구분 기호 기반 줄을 삭제하는 방법은 무엇입니까?

Perl/Shell에서 구분 기호 기반 줄을 삭제하는 방법은 무엇입니까?

누구든지 구분 기호(쉼표)를 기반으로 파일의 행을 삭제하는 데 도움을 줄 수 있습니까? 행에 열 수가 적거나 잘못된 레코드가 포함되어 있으면 삭제해야 합니다.

Input File:

a,b,c,d
a,b,d,f
c,d
a,v,b,h
d,e,v,n

위 파일에서 구분 기호가 4보다 작으면 해당 줄을 파일에서 제거해야 합니다.

Output File :

a,b,c,d
a,b,d,f
a,v,b,h
d,e,v,n

아래 명령은 한 줄의 구분 기호 수를 제공합니다. 4와 같지 않은 경우 어떻게 제거할 수 있습니까?

egrep -iv '"' file.csv | awk -F',' '{print NF}' 

감사해요.

답변1

또 다른 Perl: 쉼표가 3개 있으면 한 줄을 인쇄합니다.

perl -i.bak -ne 'print if tr/,/,/==3' file

tr연산자는 음역된 문자 수를 반환합니다.

답변2

그리고 perl:

$ perl -F, -i.bak -ane 'print if @F > 3' file

perl>5.20 의 경우 및 ( 묵시적 및 묵시적 ) -F없이 수행 할 수 있습니다 .-a-n-F-a-a-n

또는 다음을 사용할 수 있습니다 sed.

$ sed -i.bak -e '/\([^,]*,\)\{3,\}/!d' file

답변3

awk를 사용할 수 있습니다.

awk -F',' 'NF==4' file

버전 >= 4.1.0을 사용할 수 있으면 다음을 gawk사용할 수 있습니다 .inplace정보. 따라서 다음과 같을 수 있습니다.

gawk -i inplace -v INPLACE_SUFFIX=.bak -F',' 'NF==4' file

답변4

GNU sed 사용:

sed -nE '/^.+,.+,.+,.+$/p' file > output_file

관련 정보