【发布时间】:2010-04-19 13:06:05
【问题描述】:
这是输入文件的一行:
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
values 变量有效,但我只想在上面的示例中检查第一位是否等于“1”。
编辑
好的,所以我想我的问题不是很清楚。 substr 方法中的“$13”实际上是位串。因此,这个 awk 想要传递 foo.txt 中在“$13”列的位串“1”位置具有“1”的所有行。希望这可以澄清事情。
编辑 2
好的,让我很容易地分解它。上面的代码是示例,因此输入行是许多行之一。因此,并非所有行在位置 8 处都有 1。我已经仔细检查了某个位置是否同时出现了两种情况,因此无论如何我都应该得到一些输出。问题是在所有行中,它在我选择的位置上都找不到任何“1”,但是当我说它必须找到“0”时,它会返回所有行。
【问题讨论】:
-
根据您编辑的要求,您的 awk 命令适用于我。它怎么不适合你? 13号以后有田吗?如果不是,您可以打印 $0 即整行 (
printf values,$0) -
我可以使用 $0,如果不是因为我故意排除了 $2。所以序列是 $1,$3,$4 等。我想说:如果位串的第 8 位(foo.txt 的每一行中的第 13 列)等于“1”,那么将此行附加到 bar .txt
-
糟糕,我错过了丢失的 2 美元。如果你使用
if (substr($13,8,1)==1) printf ...,你会得到什么?那应该可以。 -
奇怪的是,如果我说“if (substr($13,8,1)==1)”,当我使用“if (substr($13,8,1) ==0)" 它给了我一切。这个问题发生在每个位置。 1什么都不给,0给我全部。
-
0 给你所有,因为位置 8 是 0,如果你这样做,
if语句变为真if (substr($13,8,1)==0!你让它非常混乱。显示你想要的输出。