多文件添加列的简单方法

4
如果我有多个这样的文件:
filename1.txt
# 0.2
1.0 0.0
1.5 1.0
2.0 0.8
2.5 1.1

filename2.txt

# 0.5
1.0 0.1
1.5 0.6
2.0 1.3
2.5 0.4

当所有第一列都相同时,我只想要如下输出:

# 0.7
1.0 0.1
1.5 1.6
2.0 2.1
2.5 1.5

我知道

paste filename1.txt filename2.txt | awk '{print $1, $2+$4}'

虽然这种方法可以实现,但当有超过20个文件时就不可行了。我也尝试过使用其他方法。

awk 'NR==FNR{a[NR]=$2;next}{print $1,$2+a[FNR]}' filename1.txt filename2.txt

但它只能处理两个文件,似乎忽略了其余的文件。
2个回答

7
你可以使用这个awk命令:
awk '{a[FNR]=$1; s[FNR]+=$2} END{for (i=1; i<=FNR; i++) print a[i], s[i]}' file1 file2
# 0.7
1.0 0.1
1.5 1.6
2.0 2.1
2.5 1.5

FNR 从1开始针对每个文件,因此您可以将所有输入文件传递给这个 awk 命令。


2
你比我快了几秒钟。 :P - Wintermute
谢谢,是的,我们俩都考虑到了完全相同的解决方案 :) - anubhava
谢谢!看起来好像可以用。另外一个快速问题:如果我有10个文件,想添加1到8号文件,但不包括第9或第10个文件怎么办?这行代码是否需要简单的修改,还是最好使用for循环? - Izaak Williamson
2
awk 'FILENAME ~ /filename9|filename10/ {next} {a[FNR]=$1; s[FNR]+=$2} END{for (i=1; i<=FNR; i++) print a[i], s[i]}' filename* - anubhava

1

我不明白为什么您认为使用paste/awk的解决方案是不可行的。以下是一种做法,假设每个文件只有两列:

paste * | awk '{ s=$2; for(i=4; i<=NF; i+=2) s+=$i; print $1, s }'

输出:

1.0 0.1
1.5 1.6
2.0 2.1
2.5 1.5

你说得对,这确实有效,但由于使用 FILENAME ~ /filename9|filename10/ {next},它似乎出了一些问题。也许我错过了什么。 - Izaak Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接