다음과 같이 각 줄의 단어가 쉼표로 구분되는 텍스트 파일이 있습니다.
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에서 sed
or 명령 만 사용하여 두 번째 열의 0이 아닌 숫자를 계산하고 싶습니다 .grep
메모
다른 명령을 사용하지 않고:
cut -d',' -f2 < KAR_UBONA_UBONACT15_20150929_20150930_FEEDBACK.txt | grep -vcw 0
하지만 나는 원하는 것이 cut
아니라 grep
.
답변1
-c
grep 옵션을 사용할 수 있습니다 . 다음을 사용하면 첫 번째 쉼표까지의 모든 문자와 두 번째 쉼표의 모든 문자를 제거할 수 있습니다 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
대체하여 . 나는 그것이 튜링이 완료되었으므로 가능할 것이라고 들었습니다 .p
sed
sed
sed
그냥 사용하고 싶으시다면하나의 프로그램( 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;}'