2013-02-21 41 views
1

我在包含由空格分隔的鍵和值以及僅包含鍵值的文件的文件夾中有多個文件。所有文件都按照鍵排序。所有的都有相同的密鑰。 (也沒有丟失的鑰匙)。我想有鍵,然後所有的值的文件(來自同一個文件到同一列中的值)加入unix中的多個文件

密鑰文件看起來像如下:

00001740-a 

00001740-n 

00001740-r 

00001740-v 

00001837-r 

00001930-n 

00001981-r 

00002098-a 

其餘文件看起來是這樣的:

00001740-a  5.21718e-05 

00001740-n  3.32329e-05 

00001740-r  4.5483e-06 

00001740-v  7.54663e-05 

00001837-r  8.79043e-06 

00001930-n  3.75099e-06 

00001981-r  1.4668e-06 

00002098-a  3.18465e-06 

我在加入手冊頁上找不到任何東西。請幫我在這裏。

man join: 

NAME 
     join - join lines of two files on a common field 

SYNOPSIS join [OPTION]... FILE1 FILE2 

更新 - 我寫了一個shell腳本生成的其中一個答案中提到的命令,並將其輸出到另一個shell文件,然後執行它。任何更好的想法?

#!/bin/bash 
echo -n "paste offsets.txt " 
for f in *.ppv 
do 
    echo -n " <(cut -f2 "$f")" 
done 
+0

這裏有一個更好的男人頁:http://www.manpagez.com/man/1/join/ – Johnsyweb 2013-02-21 08:11:21

+1

對不起,它從最終文件應包含什麼問題不清楚。是否有多個值與單個鍵相關聯?然後給出一個例子。 – arkascha 2013-02-21 08:11:32

+0

有多個與某個鍵相關的值,每個diff值都在diff文件中。我想將它存儲在一個文件中。 – damned 2013-02-21 09:09:51

回答

2

怎麼樣:

paste keyfile <(cut -d' ' -f2 file1) <(cut -d' ' -f2 file2) ... <(cut -d' ' -f2 fileN) 
3

請嘗試以下命令:

join FILE1 FILE2 | join - FILE3 | join - FILE4 
+0

我有大約80-90個這樣的文件。這種方式是不可行的。 – damned 2013-02-21 09:17:39

0

如果數據足夠小,以適應在內存中,嘗試:

awk 'NF > 1{ a[$1] = a[$1] " " $2} END {for(i in a) print i, a[i]}' *.ppv 

這將以不同的順序輸出密鑰,所以你可以想要輸出到sort

0

您可以使用「EVAL」執行命令,例如:

#!/bin/bash 
first="1" 
for f in *.ppv 
do 
    if [[ ${first} -eq "1" ]]; then 
     command="join offset.txt ${f}" 
     first="0" 
    else 
     command="${command} | join - ${f}" 
    fi 
done 
eval ${command}