2進数(0,1)と他の10進数(0-9)を含むファイルがあるとします。
010... 10567
011... 23678
...
など。
上記の例は実際にこれを正確に表現したものではありませんが、それは要点ではありません。 (単にこの特定の事例を説明するためのものです。)
ファイル/出力で「数字」を見つける方法はすでにわかっています。
grep '[0-9]*'
これを使用してください:
grep '[0-1]*'
10進数の一部である1と0が強調表示/選択されます。
それで、同じことをどうするべきかわかりません。ただ二進数(0,1)。したがって、出力例にはバイナリのみが表示されます(バイナリは常に同じ列にあります)。
これを行う方法はありますか?
答え1
次に、列のデータを調べて、col
列のデータに1と0のみが含まれるたびに印刷します。
列col
番号はコマンドラインに表示されます(1
ここではその値を使用します)。
awk -v col=1 '$col ~ /^[01]+$/ { print $col }' file
バイナリが常にゼロで始まることがわかっている場合は、式をから^[01]+$
(^0[01]*$
0の後に任意の数の1および/または0がオーム)に変更できます。もしあなたならまた2進数は常に3桁の数字であることを知っている場合、または^0[01][01]$
を使用してください^0[01]{2}$
。
テスト:
$ cat file
010 10567
011 23678
030 10567
012 23678
$ awk -v col=1 '$col ~ /^[01]+$/ { print $col }' file
010
011
答え2
より簡単な解決策は次のとおりです。
grep -E "\<[01]+\>" filename
\<
と\>
は単語の境界であり、正規表現は1回以上一致します01
。
awk を使用して指定された列のみを照合することもできます。 awkを使用すると、バイナリ文字列が列1にある場合は、次のことができます。
awk 'match($1,/\<[01]+\>/) {print $1}'
答え3
より良い解決策が見つかった場合(コメントセクションの@Inianのクレジット)前の投稿解決策として)
grep -E '\b[01]+\b'
これは実際のバイナリ入力でのみ動作するようです。また、10進数/その他の数字の一部である2進数と誤って一致しません。
だから:
echo "10198865" | grep -E '\b[01]+\b'
何も出力されませんが、次のようになります。
echo "101010" | grep -E '\b[01]+\b'
する。
答え4
0
連続的で1
他の数字が前後に出ない数字を検索する必要があるようです。したがって、次のよう0
に少なくとも3回連続して1
(テストされていません):
[^2-9][01]{3,}[^2-9]
編集:コメントで述べたように、これは「210001」とも一致します。