2015-04-01 20 views
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個文件,然後似乎忽略其餘。

回答

5

您可以使用此awk:1

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開始的每個文件,因此您可以通過所有的輸入文件的這個awk命令。

+2

嗯,你是幾秒鐘的速度更快。 :P – Wintermute 2015-04-01 20:50:55

+0

謝謝,是的,我們都認爲完全相同的解決方案:) – anubhava 2015-04-01 20:51:47

+0

謝謝!這似乎工作。另一個簡單的問題是:如果我有10個文件,想要添加文件1到8但不包含文件9或文件10,該怎麼辦?有沒有簡單的添加到這條線或者我最好使用for循環? – 2015-04-01 21:02:52

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 
+0

你是對的,這確實有效,但由於某種原因,它似乎不適用於'FILENAME〜/ filename9 | filename10/{next}'加法。也許我錯過了什麼。 – 2015-04-02 15:39:48

相關問題