2010-11-01 151 views
3

我有兩個文件,無論是在相同的格式 - 兩列兩者都含有一個數,例如:基於第一列合併兩個文件合併爲一個

文件1

1.00 99 
2.00 343 
3.00 34 
... 
10.00 343 

文件2

1.00 0.4 
2.00 0.5 
3.00 0.34 
... 
10.00 0.9 

,我想生成以下文件(使用,AWK時,bash perl的):

1.00 99  0.4 
2.00 343  0.5  
3.00 34  0.34 
... 
10.00 343  0.9 

感謝

回答

7
join file1 file2 

下面是一個AWK版本(sort補償AWK的不確定性數組排序):

awk '{a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2 | sort 

似乎比Perl的答案更短,更具可讀性。

+0

僅適用於安裝了GNU coreutils的* nix系統,AFAIK。 – 2010-11-01 19:17:01

+0

@Jim:在我使用的每個類Unix系統上,'join'都是默認安裝的一部分。另外「核心」是指「核心」。而且,基於OP的標籤,我假設一個Linux/Unix系統。 – 2010-11-01 19:20:23

+2

@Jim:連接由POSIX指定,[早在]之前存在(http://www.freebsd.org/cgi/man.cgi?query=join&apropos=0&sektion=0&manpath=Unix+Seventh+Edition&format=html)。 – Gilles 2010-11-02 00:00:02

1

一個Perl的解決方案

perl -anE 'push @{$h{$F[0]}}, $F[1]; END{ say "$_\t$h{$_}->[0]\t$h{$_}->[1]" for sort{$a<=>$b} keys %h }' file_1 file_2 > file_3 

好吧,看着AWK-oneliner這是短於我的第一次嘗試,它具有更好的輸出,則AWK-oneliner,它不使用「管sort -n':

perl -anE '$h{$F[0]}="$h{$F[0]}\t$F[1]"; END{say "$_$h{$_}" for sort {$a<=>$b} keys %h}' file_1 file_2 

如果在第一個文件的第二列中有沒有值的條目,那麼單行表達式的行爲就不同於join-example。

0

您可以使用Alacon - 數據庫的命令行工具Alasql

它與Node.js的,所以你需要安裝Node.js然後Alasql包:

要從你可以使用下面的命令製表符分隔的文件中加入兩個數據:

> node alacon "SELECT * INTO TSV("main.txt") FROM TSV('data1.txt') data1 
        JOIN TSV('data2.txt') data2 USING [0]" 

這是一條很長的路線。在這個例子中,所有文件都有「Sheet1」表單中的數據。