сделать матрицу из разных файлов в linux - PullRequest
0 голосов
/ 27 апреля 2020

В каталоге с именем output у меня есть 500 имен каталогов sample1_ouput ----- sample500_output Например, три файла, а именно sample1_output sample2_output sample3_output Каждый каталог *_output содержит quant.sf файл с заголовком:

Имя Длина EffectiveLength TPM NumReads

quant.sf Файл 1:

Name    Length  EffectiveLength TPM NumReads
S1  681 459.000 0.000000    0.000
S2  816 594.000 0.000000    0.000
S3  1665    1330.658    0.047059    1.000
S4  821 599.000 0.000000    0.000
S5  252 48.000  0.000000    0.000
S6  180 13.000  0.000000    0.000
S7  507 285.000 0.000000    0.000
S8  498 276.000 0.000000    0.000
S9  327 108.000 0.000000    0.000

quant.sf Файл 2:

Name    Length  EffectiveLength TPM NumReads
S1  681 458.000 0.000000    0.000
S2  816 593.000 0.000000    0.000
S3  1665    1442.000    0.000000    0.000
S4  821 598.000 0.000000    0.000
S5  252 49.000  0.000000    0.000
S6  180 14.000  0.000000    0.000
S7  507 284.000 0.000000    0.000
S8  498 275.000 0.000000    0.000
S9  327 108.000 0.000000    0.000

quant.sf Файл 3:

Name    Length  EffectiveLength TPM NumReads
S1  681 456.000 0.000000    0.000
S2  816 591.000 0.000000    0.000
S3  1665    1440.000    0.000000    0.000
S4  821 596.000 0.000000    0.000
S5  252 48.000  0.000000    0.000
S6  180 13.000  0.000000    0.000
S7  507 282.000 0.050000    0.000
S8  498 273.000 0.000000    0.000
S9  327 106.000 0.000000    0.000

Я хочу сделать один файл со столбцом 1 в виде Name, а затем TPM столбцов из всех файлов, составляющих в общей сложности 501 столбец для окончательного файла. Я хочу, чтобы у каждого столбца TPM было то же имя, что и у имени образца каталога, путем удаления суффикса _output. Окончательный пример выходного файла:

Name sample1 sample2 sample3
S1 0.000000 0.000000 0.000000
S2 0.000000 0.000000 0.000000
S3 0.047059 0.000000 0.000000
S4 0.000000 0.000000 0.000000
S5 0.000000 0.000000 0.000000
S6 0.000000 0.000000 0.000000
S7 0.000000 0.000000 0.050000
S8 0.000000 0.000000 0.000000
S9 0.000000 0.000000 0.000000

Я пытался:

paste *sf | cut -f 1,4,9,14-----n | grep -v "TPM"  > output

Но он извлекает столбец Имя более одного раза.

1 Ответ

0 голосов
/ 27 апреля 2020

Сначала извлеките имя столбца. Затем для каждого из файлов извлеките столбец TPM и объедините его с результатом. Распечатайте результат.

output=
for f in *.sf; do
   if [[ -z "$output" ]]; then
        # Initialize output with the name column from any file that is first
        output=$(cut -f1 "$f")
   fi
   # join output with the 4rth column from file
   output=$(paste <(printf "%s\n" "$output") <(
       echo "$f"
      cut -f4 "$f" | tail -n+2
   ))
done
printf "%s\n" "$output"

Tetsed on repl /

Я полагаю, с помощью утилиты columns вы можете сделать:

count=$(printf "%.1s" *.sf | wc -c)
{ printf "%s\n" *.sf | head -n1 | xargs cut -f1;  cut -f2 *.sf; } |
columns --by-columns -w1 -c$((count + 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...