在unix中连接多个文件

时间:2013-02-21 08:07:18

标签: linux unix join

我在一个文件夹中有多个文件,这个文件夹包含由空格分隔的键和值以及仅包含键值的文件。所有文件都按键排序。所有人都有相同的钥匙。 (也没有丢失的钥匙)。我希望有一个文件,其中包含键,后跟所有值(同一文件中的值放入同一列)

密钥文件如下所示:

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

4 个答案:

答案 0 :(得分:3)

请尝试以下命令:

join FILE1 FILE2 | join - FILE3 | join - FILE4

答案 1 :(得分:2)

怎么样:

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

答案 2 :(得分:0)

如果数据足够小以适合内存,请尝试:

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

这将以不同的顺序输出键,因此您可能希望将输出通过管道传输到sort

答案 3 :(得分: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}