【问题标题】:How to get a substring in awk如何在awk中获取子字符串
【发布时间】: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 !你让它非常混乱。显示你想要的输出。

标签: bash awk printf substr


【解决方案1】:
$ 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

【讨论】:

  • 我希望能够指定“1”或“0”的位置。只有 OP 示例使用了第一个位置。
  • 显示输入文件的有效示例,并使用该输入文件更清楚地描述。我无法理解你的问题。如果您尝试提取第 13 个字段的第一个字符,则 OP 中的子字符串语句是正确的。为什么它不适合你?如果您想要 13 美元的第 8 位,请执行 substr($13,8,1)==1
  • 我编辑了 OP。我正在使用这个 substr($13,8,1)==1,但它似乎不起作用。
  • 什么似乎不起作用? 13 美元的第 8 位是 0 对吗?这就是为什么它不起作用的原因,因为您正在检查 1。
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 2019-02-03
  • 2015-05-10
  • 2014-10-20
  • 1970-01-01
  • 2010-10-14
  • 2011-10-04
相关资源
最近更新 更多