AWK 在列号上递增

AWK incrementing on column number

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

do from i=0 to 9
(col+i) = (col+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

我试过探索 'loop over columns'、'increment over column' 等标签,但没有任何进展。我可以为每个 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 填充了正确的总和......等等......

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

$ awk 'BEGIN{ for(i=0; i<=9;i++) printf("$%d = $%d + $%d\n", i+30, i+10, i+20)}' /dev/null
 =  + 
 =  + 
 =  + 
 =  + 
 =  + 
 =  + 
 =  + 
 =  + 
 =  + 
 =  + 

如果 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'