копирование столбцов из разных файлов в один файл с помощью awk - PullRequest
0 голосов
/ 05 декабря 2018

У меня более 500 файлов, имеющих два столбца «Короткое имя гена» и «FPKM».Количество строк одинаковое, и столбец «Краткое имя гена» является общим для всех файлов.Я хочу создать матрицу, сохранив первый столбец как короткое имя гена (может быть взято из любого файла) и оставив остальные столбцы, имеющие FPKM.

Я использовал эту команду, которая хорошо работает, но как ее использовать для 500 файлов?

 paste -d' ' <(awk -F'\t' '{print $1}' 69_genes.fpkm.txt) \
            <(awk -F'\t' '{print $2}' 69_genes.fpkm.txt) \
            <(awk -F'\t' '{print $2}' 72_genes.fpkm.txt) \
            <(awk -F'\t' '{print $2}' 75_genes.fpkm.txt) \
            <(awk -F'\t' '{print $2}' 78_genes.fpkm.txt) > col.txt

пример данных (файлы разделены табуляцией):

head 69_genes.fpkm.txt 
gene_short_name FPKM
        DDX11L1 0.196141
        MIR1302-2HG 0.532631
        MIR1302-2   0
        WASH7P  4.51437

Ожидаемый результат

gene_short_name FPKM FPKM FPKM FPKM
DDX11L1 0.196141 0.206591 0.0201256 0.363618
MIR1302-2HG 0.532631 0.0930007 0.0775838 0
MIR1302-2 0 0 0 0
WASH7P 4.51437 3.31073 3.23326 1.05673
MIR6859-1 0 0 0 0
FAM138A 0.505155 0.121703 0.105235 0
OR4G4P 0.0536387 0 0 0
OR4G11P 0 0 0 0
OR4F5 0.0390888 0.0586067 0 0

Кроме того, я хочу изменить имя «FPKM» на «filename_FPKM».

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

В awk, используя данные @ Миха для ясности:

$ awk '  
BEGIN { FS=OFS="\t" }    # set the field separators
FNR==1 {
    $2=FILENAME "_" $2   # on first record of each file rename $2
}
NR==FNR {                # process the first file
    a[FNR]=$0            # hash whole record to a
    next
}
{                        # process other files
    a[FNR]=a[FNR] OFS $2 # add $2 to the end of the record
}
END {                    # in the end
    for(i=1;i<=FNR;i++)  # print all records
        print a[i]
}' a.txt b.txt c.txt

Вывод:

a       a.txt_1 b.txt_I c.txt_one
b       2       II      two
c       3       III     three
0 голосов
/ 05 декабря 2018

С учетом ввода

$ cat a.txt
a       1
b       2
c       3
$ cat b.txt
a       I
b       II
c       III
$ cat c.txt
a       one
b       two
c       three

вы можете выполнить цикл:

cut -f1 a.txt > result.txt
for f in a.txt b.txt c.txt
do
  cut -f2 "$f" | paste result.txt - > tmp.txt
  mv {tmp,result}.txt
done
$ cat result.txt
a       1       I       one
b       2       II      two
c       3       III     three
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...