【问题标题】:Extract column after pattern from file从文件中提取模式后的列
【发布时间】:2016-04-26 16:21:32
【问题描述】:

我有一个示例文件,如下所示:

5    6    7    8
55   66   77   88

A    B    C    D
1    2    3    4
2    4    6    8
3    8    12   16

E    F    G    H
11   22   33   44
and so on...

我想在 bash 脚本或仅在 bash 终端中输入命令,以独立于其他列提取其中一列。例如,我想使用 pattern=C 执行类似 grep/awk 命令并获得以下输出:

C
3
6
12

如何独立于其他列提取特定列,并在模式之后放置 # 行来提取,这样我的输出中就不会得到上面带有 7 或 G 列的列?

【问题讨论】:

  • 我试过 'grep -A 3 "C" filename',它在模式之后给出了所需的行,但它给出了所有的列。
  • 您应该发布相关数据的子集,而不是 some stuff .... ,因为这会改变答案的动态。另外,当您考虑这样做时,我建议您先通过answer 自己尝试一下。
  • 糟糕,您忘记发布代码了! StackOverflow 旨在帮助人们修复他们的代码。这不是免费的编码服务。任何代码都比没有代码好。元代码甚至可以展示您认为程序应该如何工作,即使您不知道如何编写它。
  • 我已经进行了更改。我已经看到了您链接到的答案。我用这些工具玩了一段时间,但无法让列部分工作。这就是为什么我认为“awk”命令可以工作但找不到如何指定列的原因。感谢您的评论和帮助。
  • @ghoti 感谢您告诉我。

标签: bash awk sed grep


【解决方案1】:

如果在找到的词之后总是 3 条记录:

awk '{for(i=1;i<=NF;i++) {if($i=="C") col=i}} col>0 && rcount<=3 {print $col; rcount++}' test

这将查看记录中的每个字段,如果找到“C”,它将捕获列号i。如果列号大于 0,那么它将打印列的内容。它最多计数 3 条记录,然后停止打印。

【讨论】:

  • 这非常有效,谢谢!不过,我有一个后续问题。如果我将其设为脚本,我希望能够在命令中指定模式和记录数,我该如何实现呢?我尝试用 $2 和 rcount
  • 您必须将变量从您的 bash/sh/csh/whatevs 脚本中“发送”到 awk 脚本中。这样做的方法是使用 awk 的 -v 标志:awk -v awkvar=$bashvar -v awkvar2=$bashvar2 '{print awkvar, awkvar2}
  • @jaypalsingh 这是假设列号是已知的,但事实并非如此。此外,您的变量没有在您的脚本中使用,但我假设 3 应该替换为 num
  • wrt You have to sort of "Send" the variable into the awk script - 这听起来很复杂,但实际上并不复杂。您必须使用 shell 变量的值或常量值来初始化 awk 变量,仅此而已。
【解决方案2】:
$ cat tst.awk
!prevNF { delete f; for (i=1; i<=NF; i++) f[$i] = i }
NF && (tgt in f) { print $(f[tgt]) }
{ prevNF = NF }

$ awk -v tgt=C -f tst.awk file
C
3
6
12

$ awk -v tgt=F -f tst.awk file
F
22

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多