2013-02-21 2 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 

Update - Я написал скрипт для создания команды, описанные в одном из ответов, и выводят его в другой файл оболочки, а затем выполнил его. любые лучшие идеи?

#!/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

+1

К сожалению, это неясно, из чего должен состоять последний файл. Есть ли несколько значений, связанных с одним ключом? Тогда дайте пример для этого. – arkascha

+0

есть несколько значений, связанных с ключом, каждое значение diff находится в файле diff. Я хочу сохранить его в одном файле. – damned

ответ

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

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} 
Смежные вопросы