grep이 일치 한 후 파일의 줄 수를 어떻게 계산합니까?


14

CSV 파일에서 문제가있는 행 뒤에 줄 수를 세려고합니다. grep -a #일치하는 것을 찾은 후 구문을 사용하여 # 줄 수를 출력 할 수 있다는 것을 알고 있습니다 . 실제 줄 수에만 관심이 있습니다. 숫자를 MAX_INT로 설정하고 파일로 파이프하고 더 많은 처리를 수행 할 수 있음을 알고 있습니다.

나는 카운트를 말해 줄 간결한 한 줄짜리 라이너를 찾고 있습니다.

어떤 제안?

답변:


15
{ grep -m1 match; grep -c ''; } <file

그것은 GNU greplseek()유능한 파일로 작동 합니다. 첫 번째 grep-m1atch 에서 멈추고 두 번째는 -c입력에 남아있는 모든 줄 을 잊어 버립니다.

GNU없이 grep:

{ sed '/match/q'; grep -c ''; } <file

물론, grep다른 옵션을 사용하거나 다른 옵션을 모두 사용할 수 있으며 한 경기에서 멈출 필요는 없습니다.


둘 다 라인을 인쇄하고 두 번째는 첫 번째 일치 항목까지 인쇄 한 다음 0입니까?
123

@ User112638726- grep -m1 match >/dev/null물론 첫 번째 경기의 출력을 떨어 뜨릴 수 있습니다 . 두 번째 문제는 GNU sed입니다. 스펙별로 입력 오프셋을 재설정하지 않습니다. -u항상 바람직하지는 않은 w / GNU 를 사용해야 합니다. 좀 더 명확 해졌지만 GNU grep와 GNU sed가 짝을 이룰 것이라고 가정 했습니다. 또한 리디렉션 grep -qm1을 단축하는 데 도움이 될 수 있다고 생각 /dev/null하지만 GNU grep는 이상한 일을 -q하고 그 두 가지가 어떻게 작동하는지 기억할 수 없습니다.
mikeserv 2016 년

1
좋은 대답-실제로 명령 그룹화의 힘을 보여줍니다. 확실하지는 않지만 wc -l보다 약간 저렴합니다 grep -c ''.
디지털 외상

1
@DigitalTrauma-그래, 나는 그것을 ( 돌아보기로) 고려 했지만, 나는 이미 그것을 작성했고 거의 운이 좋았으므로 충분히 혼자 두겠다고 생각했다. 어쨌든 당신도 그렇게 말 했으니 이제 쉽게 잘 게요.
mikeserv 2016 년

9

한 가지 방법이 있습니다.

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$

4
이것은 codegolf가 아니며 세부 정보 (FNR, END 등)를 줄 수 있습니까?
Archemar

3
확실한. awk는 FNR을 사용하여 입력 레코드 번호를 식별합니다. END는 파일 끝에 도달했을 때 실행되는 코드입니다. 따라서 일치하는 것이 발견되면 현재 레코드 번호가 기록됩니다. 파일 끝에 도달하면 파일의 총 행 수에서 해당 수를 뺍니다.
스티브

1
하나의 파일이므로 NR을 사용할 수도 있습니다.
123

6

또 다른 방법-사용은 dc약간 난해하지만 여기서는 잘 작동하는 것 같습니다.

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'

sedprob.txt"문제"와 마지막 행을 검색 하고 =명령을 사용하여 두 행의 행 번호를 출력합니다.

dc 이 두 값을 스택으로 읽어서 뒤집고, 하위 값을 빼고 차이를 인쇄합니다.


5

sed를 완전히 사용 (파이프가있는 두 명령이지만)

sed '/ddd/,$!d' file | sed -n '$='

행 앞의 모든 행을 삭제 한 후 다음 명령은 새 파일에서 행을 계산합니다.


3

문제가있는 행까지 (그리고 포함하여) 모든 행을 삭제 한 다음 나머지 행을 계산해야합니다.

sed '1,/problem/d' data.txt | wc -l

1
( "문제점"이 첫 번째 줄에 없다고 가정)
스테판 샤젤 라스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.