Объедините некоторые файлы с разделением табуляцией

Как насчет попробовать xfce, это делает приблизительно что gnome2, но лучше и с с меньшим количеством ресурсов. (склонный - получают установку xfce4).

Если это к тяжелому просвещению попытки, это легко на ресурсе, но все еще хорошо посмотреть на.

3
13.09.2015, 01:41
2 ответа

Следующий скрипт должен сделать внешнее соединение на столбце (поле) 1 всех вкладок-разделите файлы, переданные в качестве аргументов. Он использует команду присоединиться к команде , которая выполняет внешнее соединение в отсортированных файлах, 2 файла одновременно.

Он присоединяется к каждой строке в файлах, включая линии заголовка. Если вы хотите, чтобы заголовки были исключены, измените два сортировку для чего-то, что производит отсортированный файл, который их пропускает.

#!/bin/sh
if test $# -lt 2
then
    echo usage: gjoin file1 file2 ...
    exit 1
fi
sort -t $'\t' -k 1 "$1" > result
shift
for f in "$@"
do
    sort -t $'\t' -k 1 "$f" > temp
    join -1 1 -2 1 -t $'\t' result temp > newresult
    mv newresult result
done
cat result
rm result temp

Если у вас есть более старая оболочка, $ '\ T' не будет заменена вкладкой, поэтому вам нужно использовать вкладку , где вы положили буквальную вкладку между цитатами.

Оптимизация возможна, если вместо / bin / sh вы можете использовать современную оболочку, такую ​​как Bash или KSH; Например, линии

sort -t $'\t' -k 1 "$f" > temp
join -1 1 -2 1 -t $'\t' result temp > newresult

могут быть заменены на

join -1 1 -2 1 -t $'\t' result <(sort -t $'\t' -k 1 "$f") > newresult
3
27.01.2020, 21:16

Поскольку, согласно вашему сообщению, ключи в первом столбце всегда одинаковы (отличается только порядок), я думаю, вы могли бы сделать это быстрее с помощью sort , вырезать и вставить . Вы можете отсортировать один из файлов (исключая первые две строки), а затем отсортировать остальные файлы (опять же, исключая первые две строки), извлечь только второй столбец из каждого из них и вставить результаты. Пример:
1.txt :

g_s_n   FPKM56

MT-ND2  21.06
MT-TF   0.90
MT-TV   1
MT-RNR1 310.015
MT-TL1  1
MT-TM   1

2.txt :

g_s_n   FPKM53

MT-TF   0
MT-TV   0.344
MT-TM   0.10
MT-TL1  0
MT-RNR1 0
MT-ND2  158.332

3.txt :

g_s_n   FPKM58

MT-RNR1 0.82
MT-TM   7
MT-TF   1.20
MT-TV   4
MT-ND2  4.05
MT-TL1  2

выполняется:

paste <({ head -n 2; sort; } <1.txt) <({ head -n 2; sort; } <2.txt | cut -f2) \
<({ head -n 2; sort; } <3.txt | cut -f2)

производит:

g_s_n   FPKM56  FPKM53  FPKM58

MT-ND2  21.06   158.332 4.05
MT-RNR1 310.015 0   0.82
MT-TF   0.90    0   1.20
MT-TL1  1   0   2
MT-TM   1   0.10    7
MT-TV   1   0.344   4

Как это работает: {head -n 2; Сортировать; } <1.txt сортирует первый файл (кроме первых двух строк), поэтому первый столбец (общий) теперь отсортирован:

g_s_n   FPKM56

MT-ND2  21.06
MT-RNR1 310.015
MT-TF   0.90
MT-TL1  1
MT-TM   1
MT-TV   1

То же самое для других файлов: {head -n 2; Сортировать; } , только на этот раз мы извлекаем второй столбец (после сортировки первый столбец идентичен для всех файлов):

FPKM53

158.332
0
0
0
0.10
0.344

и:

FPKM58

4.05
0.82
1.20
2
7
4

все они объединены паста .


Конечно, вышеперечисленное отлично работает для ограниченного числа файлов и если ваша оболочка поддерживает подстановку процессов. В противном случае вам придется написать сценарий и использовать временные файлы (как это делает Марк в своем ответе), вставлять файлы партиями по 10, 20 и т. Д. В зависимости от ограничений вашей системы.

2
27.01.2020, 21:16

Теги

Похожие вопросы