1

これは入力ファイルの 1 行です。

フーバー 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010

そして、特定の位置が 13 列目の「1」または「0」であるかどうかをチェックする awk コマンドは、次のようになります。

 awk -v values="${values}" '{if (substr($13,1,1)==1) printf values,$1,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13}' foo.txt > bar.txt

値変数は機能しますが、上記の例では、最初のビットが「1」に等しいかどうかを確認したいだけです。

編集

わかりましたので、私の質問はあまり明確ではなかったと思います。substr メソッドの「$13」は、実際にはビット文字列です。したがって、この awk は、列「$13」のビット文字列の位置「1」に「1」がある foo.txt 内のすべての行を渡したいと考えています。これが物事を明確にすることを願っています。

編集2

わかりました、それを本当に簡単に分解しましょう。上記のコードは例であるため、入力行は多くの行の 1 つです。したがって、すべての行の位置 8 に 1 があるわけではありません。特定の位置に両方の出現があるかどうかを再確認したので、いずれにしても何らかの出力が得られるはずです。問題は、すべての行で、選択した位置に「1」が見つからないということですが、「0」を見つける必要があると言うと、すべての行が返されます。

4

1 に答える 1

2
$ cat file
FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010
FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 1.50 1.50 1.50 -42.00 100010111101110101000111010

$ awk 'substr($13,8,1)==1{ print "1->"$0 } substr($13,8,1)==0{ print "0->"$0 }' file
0->FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010
1->FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 1.50 1.50 1.50 -42.00 100010111101110101000111010
于 2010-04-19T13:13:27.437 に答える