2013-04-15 6 views
1

У меня есть два файла:Сравнить два файла, поле заголовка печати, если

Файл 1 (первая строка является заголовком)

gene h1 h2 h3 h4 h5 h6 h7 h8... 
gene_name1 e1 e2 e3 e4 e5 e6 e7 e8... 
gene_name2 ... 
gene_name3 ... 
... 

Файл 2 (без заголовка)

gene_name1 mean1 mean2 sd1 sd2 
gene_name2 ... 
gene_name3 ... 

I хотел бы вывести поле заголовка, если любое из полей e1, e2, e3 ... в File1 является> mean1 + 3 (sd1) из File2 для соответствующего имени гены. Пример: если e1> mean1 + 3 (SD1) TRUE, то для печати:

gene_name1 h1

Если е2> mean1 + 3 (SD1) TRUE, а затем добавить h2 к линии:

gene_name1 h1 h2

Сделайте это для каждой строки, если $ 1 соответствует обоим файлам. Если в файле 1 нет поля, выполняющего условие, оставьте его пустым.

Желаемый результат:

gene_name1 h1 h2 
gene_name2 
gene_name3 h5 h6 h8 
gene_name4 h1 h5 
gene_name5 h3 
gene_name6 
gene_name7 h2 h5 h7 h8 
... 

Я думал, в чем-то вроде:

awk 'FNR==NR{a[$1]=$2+3*$4;next} $1 in a ... а затем «цикл» для каждого поля в файле 1. Но я не знаю, как сохранить заголовки заголовков.

+0

Ваше описание не 100% ясно для меня, я добавил ответ на то, что я верю, что вы имеете в виду. Если это неверно, обновите вопрос с ожидаемым результатом с моего ввода. Всегда полезно размещать репрезентативный ввод и ожидаемый результат по типам вопросов. –

+0

Извините, что для меня не было так ясно, я обновил вопрос –

+0

См. Edit, теперь должен сделать трюк. –

ответ

1

Это должно сделать трюк:

FNR==NR { 
    a[$1]=$2+3*$4 
    next 
} 
FNR==1 { 
    split($0,h,/ /) 
    next 
} 
($1 in a){ 

    printf "%s ",$1 

    for (i=2;i<=NF;i++) { 
     if ($i > a[$1]) { 
      printf "%s ",h[i] 
     } 
    } 
    print "" 
} 

Демо:

$ cat file1 
gene h1 h2 h3 
gene1 1.0 2.0 3.0 
gene2 0.5 0.5 0.5 
gene3 100 50 10 

$ cat file2 
gene1 1.0 2.0 0.10 0.20 
gene2 2.4 2.6 0.24 0.45 
gene3 1.4 5.3 1.33 0.32 

$ awk -f script.awk file2 file1 
gene1 h2 h3 
gene2 
gene3 h1 h2 h3 
Смежные вопросы