2013-02-21 19 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}