【问题标题】:awk output is acting weirdawk 输出行为怪异
【发布时间】:2015-08-12 12:54:58
【问题描述】:
cat TEXT | awk -v var=$i -v varB=$j '$1~var , $1~varB {print $1}' > PROBLEM HERE

我从一个数组传递两个变量来按范围解析一个非常大的文本文件。它确实有效。

如果我使用“>”,文件的输出将只有最后三行,由 cat 和文本编辑器验证。

如果我使用“>>”,文件的输出将包括一次完整的 TEXT 读取,然后它将第二次读取划分为我想要的范围。

如果我让输出通过 shell,我会遇到与上述相同的问题。

问题: 看来 awk 正在读取每一行并打印它。然后它返回并从 TEXT 文件中选择范围。如果我在范围模式搜索中使用常量,它不会这样做。

我不明白 awk 必须读取所有行才能找到我请求的范围。

  1. 为什么要打印整个文档?
  2. 如何让它只打印选定的范围?

这是一个大项目中的最后一个障碍,我正在用头撞桌子。

谢谢!

【问题讨论】:

  • 你能提供一个数据样本和想要的输出吗?
  • 在脚本上下文中,> 是覆盖文件的 SHELL 命令,>> 是附加到文件的 SHELL 命令。它们都与 awk 没有任何关系。您是否可能尝试将输出写回用于输入的同一文件? wrt awk 命令 - 永远不要使用范围表达式,因为它们会使琐碎的任务变得非常简单,但是任何更有趣的事情都需要完全重写。如果您编辑问题以显示一些可测试的示例输入和预期输出,我们可以为您提供进一步的帮助。

标签: bash awk output


【解决方案1】:

试试这个,你没有正确分配varB

 yours: awk -v var="$i" -varB="$j" ...
 mine : awk -v var="$i" -v varB="$j" ...
                         ^^

【讨论】:

  • 糟了!我确实做到了,但我没有正确地将其复制并写入板上。你列出的就是我所拥有的。 (两台电脑,liunx机器不在网络上:(同样的问题
【解决方案2】:

除了错字之外,您不能在// 中使用变量,而是必须使用常规~ 匹配来指定。还要引用你的shell变量(这里显然不需要,但要设置一个例子)。例如

seq 1 10 | awk -v b="3" -v e="5" '$0 ~ b, $0 ~ e'

应该按预期打印 3..5

【讨论】:

  • 我没用//,我用~来匹配。另外,我有很多变量,所以我从数组(ergo -v var="$i")等中调用它们。下面解释了它们的错字。我正在使用肯特已经提出的建议。有什么建议吗?
  • 请添加您的输入和预期输出的示例。对于这个和未来的问题也是如此。
  • 这还锁着吗?
【解决方案3】:

听起来这就是你想要的:

awk -v var="foo" -v varB="bar" '$1~var{f=1} f{print $1} $1~varB{f=0}' file

例如

$ cat file
1
2
foo
3
4
bar
5
foo
6
bar
7

$ awk -v var="foo" -v varB="bar" '$1~var{f=1} f{print $1} $1~varB{f=0}' file
foo
3
4
bar
foo
6
bar

但如果没有样本输入和预期输出,这只是一个猜测,这不会解决您在使用 >>> 时看到的 SHELL 行为。

【讨论】:

    【解决方案4】:

    这就是发生的事情。我使用一个数组来输入我的变量。我将计数器设置为我认为是数组的总长度。当到达数组的最后一次迭代时,有一个空值返回给变量的 awk。这导致它打印所有内容。一旦我正确地拥有了一个具有正确数量的数组元素的计数器,打印异常就结束了。

    就 > vs >> 而言,我不知道。它确实停止了,但我在记录它时没有那么小心。我认为发生的事情是我在打印命令中使用了 $1 以节省时间,并且在最后打印的每一行都擦除了整个文件并留下了最后三个相同的匹配项。有什么值得深思的。感谢 Ed 的诚实工作。不用感谢 Robo 的回复。

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 2017-03-20
      • 1970-01-01
      • 2018-05-23
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多