如何在awk中获取子字符串

时间:2010-04-19 13:06:05

标签: bash awk printf substr

这是输入文件的一行:

FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010

一个awk命令,检查某个位置,如果它在第13列是“1”或“0” 类似的东西:

 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想要传递foo.txt中所有在“$ 13”列位串“1”处有“1”的行。希望这能澄清事情。

编辑2

好的,让我轻松分解它。上面的代码是示例,因此输入行是多条线之一。因此,并非所有的线都在位置8处有1。我已经仔细检查过某个位置是否同时出现,所以在任何情况下我都应该获得一些输出。事情是,在所有行中它都没有在我选择的位置上找到任何“1”,但是当我说它必须找到“0”时它会返回所有行。

1 个答案:

答案 0 :(得分: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