【问题标题】:AWK incrementing on column numberAWK 在列号上递增
【发布时间】:2020-10-28 14:56:56
【问题描述】:

我有一个大文件和一些要在列上执行的重复性任务:用简单的语言来说,大多数任务都愿意

do from i=0 to 9
(col$30+i) = (col$10+i) + (col&20+i)

我希望在每个循环中:

我=0 col$30 = col$10 + col$20

我=1 col$31=col$11+col$21

... 我=9 col$39=col$19+col$29

我尝试探索诸如“列循环”、“列增量”之类的标签,但没有什么能轻易找到。我可以为每个 i 编写它,但想知道是否有一个魔术技巧可以更有效且可转置到其他类似情况。 谢谢!

虚拟数据

col10 col11  col20 col21  col30 col31

… 2 42 … 12 1 … 14 43
… 2 83 … 22 1 … 24 84
… 2 45 … 33 4 … 35 49
… 3 61 … 36 3 … 39 64

所以在第 1 次迭代中,col30 填充了正确的总和,在第 2 次迭代中,col2 填充了正确的总和......等等......

【问题讨论】:

  • 您能否在您的问题中发布输入示例和预期输出示例,以便更好地理解问题。
  • @RavinderSingh 我添加了一张虚拟数据的图片-我希望没问题
  • 请您仅以文本形式发布数据,以便我们可以复制并复制/粘贴以进行测试等。
  • 您的伪代码直接转换为awk '{ for(i=0; i<=9; ++i) $(30+i) = $(10+i) + $(20+i) }1'
  • `{ sum = 0; for (i = 1; i

标签: loops awk increment


【解决方案1】:

如果 colN 指的是第 N 列,则您的伪代码直接转换为

awk '{ for(i=0; i<=9; ++i) $(30+i) = $(10+i) + $(20+i) }1'

您的虚拟数据看起来像是列标签,在这种情况下,您必须解析第一行并找出哪个列号对应于哪个标签。以您为例,

awk 'NR==1 { for(n=0; n<=NF; ++n) if ($n ~ "^col[123][0-9]$") a[$n]=n }
    { for(i=1; i<=9; ++i) a[30+i] = a[10+i] + a[20+i] }1'

【讨论】:

    【解决方案2】:

    作为测试工具 - 您可以更进一步:

    $ awk 'BEGIN{ for(i=0; i<=9;i++) printf("$%d = $%d + $%d\n", i+30, i+10, i+20)}' /dev/null
    $30 = $10 + $20
    $31 = $11 + $21
    $32 = $12 + $22
    $33 = $13 + $23
    $34 = $14 + $24
    $35 = $15 + $25
    $36 = $16 + $26
    $37 = $17 + $27
    $38 = $18 + $28
    $39 = $19 + $29
    

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 2017-01-20
      • 2013-03-09
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多