gpt4 book ai didi

linux - Awk:对具有相同列布局的多个文件的列值求和

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:44 26 4
gpt4 key购买 nike

我有许多具有相同 header 的文件:

COL1、COL2、COL3、COL4

您可以忽略 COL1-COL3。 COL4 包含一个数字。每个文件包含大约 200 行。我正在尝试对各行进行总结。例如:

文件 1

COL1 COL2 COL3 COL4
x y z 3
a b c 4

文件 2

COL1 COL2 COL3 COL4
x y z 5
a b c 10

然后返回一个新文件:

COL1 COL2 COL3 COL4
x y z 8
a b c 14

有没有 AWK 的简单方法?如果需要,我会使用 AWK,我只是认为可能有一个简单的单行代码,我可以立即运行。我心目中的AWK脚本感觉有点长。

谢谢

最佳答案

pasteawk 组合,如 Kristo Mägi's answer , 是你最好的选择:

  • paste 合并输入文件中的相应行,
  • 将单个输入行流发送到 awk,每个输入行包含要汇总的所有字段。

假设输入文件和列的数量固定,Kristo 的答案可以简化为(使处理更有效率):

paste file1 file2 | awk '{ print $1, $2, $3, (NR==1 ? $4 : $4 + $8) }'

注意:上面产生了用空格分隔的输出列,因为 awkOFS 默认值,输出 -字段分隔符,是一个空格。


假设所有文件都具有相同的列结构和行数,下面是一个解决方案的概括,它:

  • 概括为超过 2 个输入文件(以及超过 2 个数据行)
  • 泛化到任意数量的字段,只要要汇总的字段是最后一个。
#!/bin/bash

files=( file1 file2 ) # array of input files
paste "${files[@]}" | awk -v numFiles=${#files[@]} -v OFS='\t' '
{
row = sep = ""
for(i=1; i < NF/numFiles; ++i) { row = row sep $i; sep = OFS }
sum = $(NF/numFiles) # last header col. / (1st) data col. to sum
if (NR > 1) { for(i=2; i<=numFiles; ++i) sum += $(NF/numFiles * i) } # add other cols.
printf "%s%s%s\n", row, OFS, sum
}
'

请注意,\t(制表符)用于分隔输出字段,并且由于依赖 awk 的默认行拆分为字段,不保证在字段之间保留准确的输入空格。

关于linux - Awk:对具有相同列布局的多个文件的列值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44597484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com