텍스트 파일에서 두 번째 열의 각 행에 대해 0이 아닌 숫자를 계산합니다.

텍스트 파일에서 두 번째 열의 각 행에 대해 0이 아닌 숫자를 계산합니다.

다음과 같이 각 줄의 단어가 쉼표로 구분되는 텍스트 파일이 있습니다.

7022122465,0,\N,,0,2015-09-29 10:48:33
7022597642,0,\N,,0,2015-09-29 10:48:33
7022848906,0,\N,,0,2015-09-29 10:48:33
7022848906,5,\N,,0,2015-09-29 10:48:33
7022848906,55,\N,,0,2015-09-29 10:48:33
.....................................etc

Linux/UNIX에서 sedor 명령 만 사용하여 두 번째 열의 0이 아닌 숫자를 계산하고 싶습니다 .grep

메모

다른 명령을 사용하지 않고:

cut -d',' -f2 < KAR_UBONA_UBONACT15_20150929_20150930_FEEDBACK.txt | grep -vcw 0

하지만 나는 원하는 것이 cut아니라 grep.

답변1

-cgrep 옵션을 사용할 수 있습니다 . 다음을 사용하면 첫 번째 쉼표까지의 모든 문자와 두 번째 쉼표의 모든 문자를 제거할 수 있습니다 sed.

sed 's/^[^,]*,//;s/,.*//' < the_file | grep -c -E '[^0]'

편집: 이 sed명령은 귀하의 명령과 동일하므로 cut원래 명령을 사용할 수도 있습니다 grep.

EDIT2: 하나의 명령만 사용하려면 @cuonglm grp 답변을 사용할 수 있습니다. 만 사용하고 싶다면한 번의 호출그 중 sed마지막 줄 수를 합산하려면 레이블 작업이 많이 필요할 것입니다.

sed -E -n '
    s/^[^,]*,[^0,]+,.*/+1/   # replace the lines we are interested in with "+1"
    T delete_line            # if we did not do a substitution right now we jump to "delete_line"
    H                        # we did not jump (so we did the substitution and append the "+1" to the hold space
    : delete_line            # the label, here we do nothing (silently drop the current line)
    $ {                      # on the last line we ...
        s/.*/0/              # replace the whole line with "0"
        G                    # append the hold space (all the "+1" from before")
        s/\n//g              # remove all newlines
        p                    # print the line
    }' < the_file

이제 파이프로 연결하거나 명령을 복잡한 마법 으로 bc대체하여 . 나는 그것이 튜링이 완료되었으므로 가능할 것이라고 들었습니다 .psedsedsed

그냥 사용하고 싶으시다면하나의 프로그램( sed) 하지만 여러 번 호출하는 것은 훨씬 쉽습니다.

sed '/^[^,]*,0,.*/d' < the_file | sed -n '$='

답변2

와 함께 grep:

grep -c '^[^,]*,[^0]' <file

두 번째 열이 정수처럼 구성된 경우에만 작동하지만 -0, +0. 보다 일반적인 경우는 다음을 참조하세요.@Stéphane Chazelas의 답변.

답변3

grep -c '^[^,]*,[-+0-9.]*[1-9]'

12이는 , -1, 0e+12, 01, 로 표현되는 숫자를 포함해야 합니다 0.0001. 그러나 예를 들어 0xFF또는 예 InfNaN들면 그렇지 않으므로 더 정식적인 것과는 여전히 다릅니다.

POSIXLY_CORRECT=1 awk -v n=0 -F , '$2 != 0 {n++}; END{print n}'

입력에 이러한 형식으로 표현된 숫자가 있는 경우.

유일한 솔루션 의 경우 sed다음을 수행할 수 있습니다.

sed '/^[^,]*,[-+0-9]*[1-9]/!d' | sed -n '$='

그러나 호출이 하나만 있는 솔루션의 경우 sed산술 연산을 직접 수행해야 합니다.

sed -n '
  1{x;s/$/0,:0123456789,0/;x;}
  /^[^,]*,[-+0-9]*[1-9]/ {
    x;:1
    s/^,/1/;s/\(.\),\(.*:.*\1\(,*.\)\)/\3\2/;t1
    s/:/,:/
    x
  }
  ${x;s/,.*//p;}'

관련 정보