awk + ​​csv에서 필드 구분 기호를 계산하고 줄 번호를 인쇄합니다.

awk + ​​csv에서 필드 구분 기호를 계산하고 줄 번호를 인쇄합니다.

50000개 이상의 행이 포함된 csv 파일이 있습니다. 이는 단지 예일 뿐입니다.

Dcccrev,wefrwvfr,rfregt,wr4f,rfvrv,ecxwec,ecfrv,rfrf
Grge,gtgr,frfrv,gthtgv,gerg5tgvrt,rvrfvtg,tgt,frfrf,rfrf
Drfrfr,t,tgtg,rf,rgr,grtg,tgt,gtgtg,rg
.
.
.

내 작업은 다음과 같습니다. 각 줄의 구분 기호 "," 수가 7이 아닌 경우 줄 번호를 인쇄해야 합니다.

이 작업을 위해 awk 라인이나 perl 라인을 생성하는 것이 가능합니까?

echo나 cat을 사용하여 시간을 보낼 필요가 없습니다.

답변1

awk를 사용하면 매우 쉽습니다. 구분 기호를 설정한 다음 -F','NF를 사용하여 열 수를 계산할 수 있습니다. 7개의 쉼표에는 8개의 필드가 필요하고 NR을 사용하여 현재 줄 번호를 인쇄합니다.

awk -F ',' 'NF != 8 {print NR}' test.txt

test.txt의 내용

Dcccrev,wefrwvfr,rfregt,wr4f,rfvrv,ecxwec,ecfrv,rfrf
Grge,gtgr,frfrv,gthtgv,gerg5tgvrt,rvrfvtg,tgt,frfrf,rfrf
Drfrfr,t,tgtg,rf,rgr,grtg,tgt,gtgtg,rg

산출

2
3

답변2

Perl의 s/// 연산자(tr///(y///라고도 함)를 사용할 수도 있음)는 수행된 대체 횟수를 반환하며, 이는 ","의 개수를 찾는 데 사용할 수 있습니다. 마찬가지로 m// 연산자는 일치 항목 수를 반환합니다.

perl -lne 's/,//g == 7 or print $.'      yourfile
perl -lne 'print $. if 7 != (() = /,/g)' yourfile
sed   -ne 's/[^,]//g; /^.\{7\}$/!='      yourfile

관련 정보