Добавление столбцов из нескольких файлов в новый файл с именем столбца = имя файла в Linux - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть несколько файлов с расширением .profile с 6 столбцами.Первые 3 столбца каждого файла одинаковы.Я хочу, чтобы выходной файл содержал первые 3 (похожих) столбца, а затем добавлял шестой столбец из каждого файла.Имя столбцов, добавляемых в выходной файл, должно совпадать с именем входного файла.Входной файл выглядит следующим образом

 FID       IID  PHENO    CNT   CNT2    SCORE
  00010   0001002      2     12      2 -0.00285
  00017   0001702      2     12      2 -0.00285

Другой входной файл выглядит следующим образом

FID       IID  PHENO    CNT   CNT2    SCORE
  00010   0001002      2     28      9 -0.00843036
  00017   0001702      2     28      9 0.00710286

Имена двух файлов: "Artery_Aorta.ENSG00000000460.12.wgt.RDat.txt.profile "и" Artery_Aorta.ENSG00000000971.11.wgt.RDat.txt.profile "соответственно.Я хочу, чтобы мой выходной файл выглядел как

FID       IID  PHENO  ENSG00000000460.12  ENSG00000000971.11
  00010   0001002    2   -0.00285   -0.00843036
  00017   0001702    2   -0.00285     0.00710286

До сих пор я пробовал

paste *.profile | awk '{print $1, $2, $3, $6, $6 + 6}'

Но вывод не такой, как хотелось бы.Это добавляет 6 к значениям в $ 6.Однако я хотел напечатать каждый шестой столбец, добавленный к предыдущим столбцам в выходном файле.Выходной файл выглядит следующим образом

FID IID PHENO SCORE 6
00010 0001002 2 -0.00843036 5.99157
00017 0001702 2 0.00710286 6.0071

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

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

#! /bin/bash
merge() {
    cols=$(seq -s, 6 6 $(("$#" * 6)))
    header=$(grep -o 'ENSG[0-9]*.[0-9]*' <<< "$*" | paste -s)
    paste "$@" | cut -f1-3,"$cols" | sed "1s/SCORE.*/$header/"
}
merge Artery_Aorta.*
0 голосов
/ 26 ноября 2018

AWK решение, если вам нужно добавить 6-й столбец из каждого входного файла и отсортировать его как Ваш ввод:

awk '
(NR==FNR) { arro[++order]=$1 FS $2 FS $3; arr[$1 FS $2 FS $3]=$6; }
(NR!=FNR) { arr[$1 FS $2 FS $3]=arr[$1 FS $2 FS $3] FS $6; }
END { for (i=1;i<=order;i++) print(arro[i] FS arr[arro[i]]); }
' *.profile

Выход:

FID IID PHENO SCORE SCORE
00010 0001002 2 -0.00285 -0.00843036
00017 0001702 2 -0.00285 0.00710286

Ввод:

$ ls *.profile
Artery_Aorta.ENSG00000000460.12.wgt.RDat.txt.profile  Artery_Aorta.ENSG00000000971.11.wgt.RDat.txt.profile

Для запроса комментария здесь решение с заменой добавленного столбца подстрокой имени файла:

awk '
(FNR==1) {match(FILENAME,/ENSG[0-9]+\.[0-9]+/); $6=substr(FILENAME,RSTART,RLENGTH);}
(NR==FNR) { arro[++order]=$1 FS $2 FS $3; arr[$1 FS $2 FS $3]=$6; }
(NR!=FNR) { arr[$1 FS $2 FS $3]=arr[$1 FS $2 FS $3] FS $6; }
END { for (i=1;i<=order;i++) print(arro[i] FS arr[arro[i]]); }
' *.profile

Вывод:

FID IID PHENO ENSG00000000460.12 ENSG00000000971.11
00010 0001002 2 -0.00285 -0.00843036
00017 0001702 2 -0.00285 0.00710286
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...