다음과 같이 각 줄의 단어가 쉼표로 구분된 텍스트 파일이 있습니다.
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
할 수 있다고 들었으므로 가능할 것입니다.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;}'