2010-10-11 3 views
2

Как соединить все файлы в каталоге. Я могу сделать это за один шаг, явно назвав файлы ниже, есть ли способ сделать это без явного указания файлов?Присоединиться ко всем файлам в каталоге

join <(\ 
join <(\ 
join <(\ 
join\ 
<(sort ${rpkmDir}/HS0477.chsn.rpkm)\ 
<(sort ${rpkmDir}/HS0428.chsn.rpkm))\ 
<(sort ${rpkmDir}/HS0419.chsn.rpkm))\ 
<(sort ${rpkmDir}/HS0299.chsn.rpkm))\ 
<(sort ${rpkmDir}/HS0445.chsn.rpkm) 

ответ

2
#!/bin/bash 

data= 
for f in "${rpkmDir}"/HS*.chsn.rpkm 
do 
    if [ ! "$data" ] 
    then 
    data="$(sort "$f")" 
    continue 
    fi 
    data="$(join <(sort "$f") /dev/stdin <<< "$data")" 
done 
echo "$data" 
+0

Вам нужно «эхо» $ data «» в трубу в bash? Или объясните, что вы создали сценарий и должны выполнить то, что вы создали в качестве сценария оболочки? –

+0

Это действительно сценарий. Я надеялся, что линия shebang наверху сделала бы это очевидным. –

+0

Это сценарий, который пишет сценарий - я думаю. Затем вам нужно подать вывод сценария, показанного в оболочке. Обычно вы просто выполняете скрипт, чтобы ... выполнить команды. Здесь вы должны выполнить свой скрипт, а затем запустить bash на выходе. –

0

Вы можете сделать это кошки ./*> выходной_файл

+1

Нет - это не работает. Join находит соответствующие строки в файлах на основе ключа (поскольку в первом столбце каждого файла не указан ключ), предполагая, что все файлы отсортированы в том же порядке. –

1

Поскольку join (в классическом UNIX и под POSIX) определяется так она работает на строго два файла в то время, вам придется как-то сделать итерацию.

Хотя ваши обозначения удивительно минимальны, это также непостижимо. Скорее всего, вы можете использовать трубы и тот факт, что '-' как имя файла означает стандартный ввод, чтобы изменить последовательность, я думаю. Но сложная часть соединяет все вместе, не создавая явных временных файлов. Вам может быть лучше просто написать сценарий, который записывает ваши записи в сценарии, и передает это в bash.

Может быть (непроверенный скрипт):

cd ${rpkmDir} 
ls HS*.chsn.rpkm | 
{ 
read file 
script="sort $file" 
while read file 
do 
    script="$script | join - <(sort $file)" 
done 
} | bash 
+0

Я не знал о трюке. Спасибо +1 –

1

использовать AWK, что вы хотите присоединиться на 1-м поле

awk '{a[$1]=a[$1] FS $0}END{for(i in a) print i,a[i]}' file* 
+0

Это не устраняет строки, в которых file1 содержит ключ, а file2 - нет, тогда как команда join (без параметров) устраняет непревзойденные строки. –

+0

исправьте меня, если я ошибаюсь, но я не вижу, что OP заявляет это требование. И я уже заявил в своем посте свое предположение, основанное на примере на первом поле. Пока OP не разработает свой формат данных, все решения будут основываться на диких предположениях и предположениях. Кстати, его тоже не так сложно включить код, чтобы делать то, что вы предполагаете. – ghostdog74

+0

Использование пасты каким-то образом показалось бы лучше для этого приложения –

Смежные вопросы