,
(쉼표)로 구분된 숫자가 있는 파일이 있습니다 . 또한 사이에 일련의 숫자가 포함되어 있습니다. 예를 들어 다음과 같은 300-400
텍스트 파일이 있습니다 .testme.txt
200,300,234,340-350,400,360,333-339
409-420
4444-31231231
348
번호가 존재하는지 알고 싶습니다 348
. 348은 2곳에 나타납니다:
- 340-350
- 마지막 줄에.
그것을 찾는 방법? sed, awk에서 사용해 보았지만 regex
숫자 범위를 캡처하기 위해 스크립트를 작성할 수 없습니다. 알아낼 수 있는 다른 방법이 있나요?
업데이트: 무차별 대입 솔루션 1개를 찾았으며 범위에서만 작동합니다.
count=0;
num1=348;
for i in `sed 's/\([0-9]\+\-[0-9]\+\)/:&:/g' testme.txt |
awk -F: '{ for(i=1; i<=NF; i++) if($i ~/[0-9]+-[0-9]+/){print $i} }'`;
do
lh=`echo $i | awk -F\- '{print $1}'`;
rh=`echo $i | awk -F\- '{print $2}'`;
if [ $lh -le $num1 -a $rh -ge $num1 ];
then
count=`expr $count + 1`;
fi;
done
echo $count;
답변1
,
또는 \n
레코드 구분 기호 및 -
필드 구분 기호 로 처리하는 GNU awk 솔루션입니다 . 필드 수를 기준으로 동일성 검사 또는 범위 검사 적용
awk -v num=348 -v RS=',|\n' -F'-' 'NF == 2 && $1 <= num && $2 >= num{c++};
NF == 1 && $0 == num{c++};
END{print c+0}' file
2
답변2
사용할 수 있는 경우 perl
:
$ perl -F',' -anle '
for (@F) {
($l,$h) = split "-";
$count++ if $l == 348 || ($l < 348 and $h >= 348);
}
END {print $count}
' file
2
답변3
이 답변은 다음을 제공합니다필드뿐만 아니라 지정된 숫자를 포함합니다.철사, 해당 수준의 세부정보가 필요한 경우(데이터 범위에 중복이 포함될 수 있음):
awk -v num=348 -F, '{
for (i=1; i<=NF; i++) {
if ($i == num || (split($i, a, /-/) == 2 && (a[1] <= num && num <= a[2]))) {
print $i
}
}
}' <<END
200,300,234,340-350,400,360,333-339
409-420
4444-31231231
348
1-400,100-1000
END
340-350
348
1-400
100-1000
낄낄 웃으려면 골프를 쳐보세요:
awk -F, '{for(i=1;i<=NF;i++)if($i==n||(split($i,a,/-/)==2&&a[1]<=n&&n<=a[2]))print $i}' n=348 file
답변4
이 예에서는 match 함수를 사용합니다.
awk -F ',' '{num = 348; i = 0; while(i <= NF) {i++; match($i,/([0-9]+)-?([0-9]*)/,arr); if(arr[1] == num || (arr[1] <= num && num <= arr[2])){count++}}} END {print count}' file