awk输出表现得很奇怪

时间:2015-08-12 12:54:59

标签: bash awk output

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. 如何才能将其打印到所选范围?
  3. 这是一个大项目的最后一个障碍,我正在敲打桌子。

    谢谢!

4 个答案:

答案 0 :(得分:1)

尝试一下,你没有以正确的方式分配varB

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

答案 1 :(得分:1)

除了拼写错误之外,您无法在//中使用变量,而是必须使用常规~匹配进行指定。同时引用你的shell变量(这里显然不需要,但是要设置一个例子)。例如

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

应按预期打印3..5

答案 2 :(得分:1)

听起来这就是你想要的:

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

e.g。

$ 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

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

答案 3 :(得分:0)

这里发生了什么。我使用数组输入我的变量。我设置计数器,我认为是数组的总长度。当达到数组的最后一次迭代时,变量的awk返回null值。这导致它打印一切。一旦我正确地使用具有正确数量的阵列元素的计数器,打印奇怪就结束了。

至于> vs>>去吧,我不知道。它确实停止了,但我在记录它时并不小心。我认为发生的事情是我在打印命令中使用$ 1来节省时间,并且在最后打印的每行都擦除整个文件并留下最后三个相同的匹配。需要思考的东西。感谢Ed的诚实工作。并且不要感谢Robo的回应。