awk - 전체 열의 패턴 수 계산

awk - 전체 열의 패턴 수 계산

2개의 열이 있는 다음 csv 파일이 있습니다.

Header1,Header2
AU3CB0222255,EBFXFR
AU3CB0222271,DBFXFR
AU3CB0225233,DBFXFR
AU3CB0225662,DBFXFR
AU3CB0226264,DBFXFR

로 시작하지 않는 2열의 필드 수를 계산하고 싶습니다 E.

다음 명령을 시도했지만 제대로 작동하지 않습니다.

awk '$2 !~ /^E_/ { count++ }END{ print count }' FinalOutput.csv

답변1

명령 awk에 몇 가지 문제가 있습니다 .

  • 필드 구분 기호를 지정하지 않았으므로 awk대신 공백으로 줄이 분할됩니다 ,. -F','명령줄 옵션을 사용하여 필드 구분 기호를 설정할 수 있습니다 .
  • 귀하의 정규식에는 다음으로 시작하지 않는 필드 (열 2 값 없음) /^E_/를 찾도록 명시되어 있습니다.E_아니요로 시작하지 않는 것들만요 E. 제거하다 _.
  • 명령은 머리글 행도 계산합니다. FNR내부 변수를 사용할 수 있습니다 (현재 줄 번호로 자동 설정됨).현재 파일 내에서)는 첫 번째 행을 제외합니다.
  • Rakesh Sharma가 지적했듯이,모두로 시작하는 줄의 경우 초기화되지 않은 변수 사용으로 인해 E명령은 끝에 빈 문자열을 인쇄합니다 . 대신 인쇄하여 강제로 숫자로 해석 0할 수 있습니다 .count+0count

수정된 버전은

awk -F',' 'FNR>1 && $2!~/^E/{count++} END{print count+0}' FinalOutput.csv

FNR전역 라인 카운터 대신 파일별 라인 카운터를 사용했기 때문에 NR이는 모든 파일에 헤더 라인이 있는 여러 입력 파일에도 작동합니다. 즉, 다음과 같이 사용할 수도 있습니다.

awk -F',' ' ... ' FinalOutput1.csv FinalOutput2.csv ...

답변2

다른 방법:

  • awk조건이 true이면 기본적으로 인쇄되므로 간단히 다음을 수행할 수 있습니다.

    $ awk -F, 'NR>1 && $2!~/^E/' file | wc -l
    4
    
  • 두 번째 줄부터 시작하는 파일을 인쇄하고 쉼표 뒤에 E가 아닌 문자가 나타나는 횟수를 세어보세요(예제에 표시된 것처럼 줄당 쉼표가 하나만 있다고 가정합니다).

    $ tail -n+2 file | grep -c ',[^E]'
    4
    
  • perl

    $ perl -F, -lane '$c++ if $.>1 && $F[1] !~ /^E/ }{ print $c' file
    4
    
  • sed그리고wc

    $ sed -n '1d; /,[^E]/p' file | wc -l
    4
    

답변3

당신은 가까이 있고 awk -F, 'NR>1{if ($2 !~ /^E/){count++}} END {print count}'일해야합니다.

-F,awk에게 이것이 ,구분 기호라고 말해주세요.

NR>1스트립 제목

샘플 파일에서 실행했는데 올바른 출력이 생성되었습니다.

답변4

전체 파일을 삼키십시오(NR 1로 만들기).

$ awk -F '\n[^\n]*,[^E]' '{ print NF-1 }' RS='^$' file
4

PCRE 모드의 GNU grep

$ < grep -zoP '\n.*\K,[^E]'  | xargs -r0 -n1 | wc -l
4

후루룩 소리 모드의 Perl

$ perl -F'\n.*,[^E]' -pal -0777e '$_=$#F' file 
4

POSIX grep /헤더

$ { head -n 1 > /dev/null; grep -c ',[^E]'; } < file
4

GNU sed확장 정규식 모드에서

$ sed -Ee "
    1d;/,[^E]/{z;H;}
    \$!d;g;y/\n/d/
    :a
      s/d{10}/#/g
      s/#([0-9]*)$/#0\1/
      $(seq 9 -1 1 | xargs -I {} printf 's/d{%d}/%d/;' {} {})
      y/#/d/
    ta
    s/^\$/0/
" file
4

관련 정보