我在一个文件夹中有多个文件,这个文件夹包含由空格分隔的键和值以及仅包含键值的文件。所有文件都按键排序。所有人都有相同的钥匙。 (也没有丢失的钥匙)。我希望有一个文件,其中包含键,后跟所有值(同一文件中的值放入同一列)
密钥文件如下所示:
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 :(得分: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}