,
(カンマ)で区切られた数字のファイルがあります。また、間に一連の数字が含まれています。たとえば、次の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