繁体   English   中英

AWK 在列号上递增

[英]AWK incrementing on column number

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

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

我希望在每个循环中:

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

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

... i=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 填充了正确的总和......等等......

如果colN你的意思是第N列,你的伪代码直接转换为

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

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

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'

作为测试工具——你可以更进一步:

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM