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+0
count
수정된 버전은
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