Присоедините указанный столбец c для нескольких файлов и сохраните имя файла в качестве имени столбца. - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь объединить несколько файлов, разделенных табуляцией:

File_A.tsv

probeId   BetaVal    Annot
  a         1         X
  b         2         Y
  c         3         Z

File_B.tsv

probeId   BetaVal    Annot
  a         4         X
  b         5         Y
  c         6         Z

File_ C .tsv

probeId   BetaVal    Annot
  a         7         X
  b         8         Y
  c         9         Z

Как объединить эти файлы по столбцу BetaVal и стабильному sh имени файла в качестве имени столбца (получая также файл, разделенный табуляцией)?

probeId  File_A.tsv   File_B.tsv   File_C.tsv   Annot
  a           1           4             7         X
  b           2           5             8         Y
  c           3           6             9         Z

Я пытался что-то вроде :

for file in *;
do
join -j 1 File_A file;
done

Но это не правильно. Более того, я не уверен, как записывать имена файлов в качестве имен столбцов.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020
echo -e "\nprobeId  File_A.tsv   File_B.tsv   File_C.tsv   Annot";\
join -o 1.1 1.2 2.2 2.3 -1 1 -2 1 File_A.tsv File_B.tsv|\
join -o 1.1 1.2 1.3 2.2 1.4 -1 1 -2 1 - File_C.tsv |\
awk '{printf(" %-8s %-12s %-12s %-12s %s\n", $1,$2,$3,$4,$5);}'|tail +2

probeId  File_A.tsv   File_B.tsv   File_C.tsv   Annot
 a        1            4            7            X
 b        2            5            8            Y
 c        3            6            9            Z

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

https://linuxconfig.org/learning-linux-commands-join

https://landoflinux.com/linux_join_command.html

объединить несколько файлов

1 голос
/ 22 апреля 2020

Вы можете использовать это gnu awk:

awk -v OFS='\t' '{
   a[$1][ARGIND] = (FNR==1?FILENAME:$2)
   b[$1] = $3
}
END {
   for (i in a) {
      printf "%s", i
      for(j in a[i])
         printf "%s%s", OFS, a[i][j]
      print OFS b[i]
   }
}' File_[ABC].tsv | column -t

probeId  File_A.tsv  File_B.tsv  File_C.tsv  Annot
a        1           4           7           X
b        2           5           8           Y
c        3           6           9           Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...