텍스트 파일의 두 번째 열의 각 행에 대해 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에서 or 명령만 사용하여 sed두 번째 열의 0이 아닌 숫자를 계산 하고 싶습니다.grep

노트

다른 명령은 사용되지 않습니다.

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

그러나 나는 그것을 원하는 것이 아니라 cut그것을 사용해야 합니다 grep.

답변1

grep 옵션을 사용할 수 있습니다 -c. 다음을 사용하여 첫 번째 쉼표 앞의 모든 문자와 두 번째 쉼표 뒤의 모든 문자를 제거할 수 있습니다 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를 들면 그렇지 Inf않기 NaN때문에 이것은 여전히 ​​더 정식적인 것과는 다릅니다.

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;}'

관련 정보