Использование awk для хранения значений из чтения столбцов для нескольких файлов - PullRequest
0 голосов
/ 16 марта 2012

Я использую cygwin на Windows 7 . У меня есть каталог со всеми текстовыми файлами, и я хочу пройти через него и сохранить данные из второго столбца первых трех строк для каждого файла (1,2) (2,2) и (3,2).

Итак, код будет выглядеть примерно так:

  x1[0]=awk 'FNR == 1{print $2}'$file1

  x1[1]=awk 'FNR == 2{print $2}'$file1

  x1[2]=awk 'FNR == 3{print $2}'$file1

Затем я хочу использовать деление на 100 $x1 плюс 1 для доступа к данным из другого файла и сохранения их в массиве. Так вот:

let x1[0]=$x1[0]/100 + 1 

let x1[1]=$(x1[1]/100)+1

let x1[2]=$(x1[2]/100)+1

read1=$(awk 'FNR == '$x1[0]' {print $1}' $file2) 

read2=$(awk 'FNR == '$x1[1]' {print $1}' $file2)

read3=$(awk 'FNR == '$x1[2]' {print $1}' $file2)

Сделайте то же самое для другого файла, за исключением того, что для этого нам не нужно $x1. 1021 *

read4=$(awk 'FNR == 1{print $3,$4,$5,$6}' $file3) 

Наконец, просто выведите все эти значения в файл, т.е. read1-4

Нужно сделать это в цикле для всех файлов в папке, не совсем уверен, как это сделать. Сложность в том, что имя файла $file3 зависит от имени файла $file1,

так что если $file1 = abc123def.fna.map.txt

$file3 будет abc123def.fna

$file2 жестко закодирован в нем и остается неизменным для всех итераций.

file1 - это файл .txt, часть которого выглядит следующим образом:

 99 58900
 16 59000
 14 73000

file2 содержит 600 строк строк.

'Actinobacillus_pleuropneumoniae_L20'
'Actinobacillus_pleuropneumoniae_serovar_3_JL03'
'Actinobacillus_succinogenes_130Z'

'file3' - это FASTA файл, и первые две строки выглядят так:

>gi|94986445|ref|NC_008011.1| Lawsonia intracellularis PHE/MN1-00, complete genome
ATGAAGATCTTTTTATAGAGATAGTAATAAAAAAATGTCAGATAGATATACATTATAGTATAGTAGAGAA

Выходные данные могут просто записать все 4 чтения в случайный файл или, если возможно, могут сравнить read1, read2, read3, и если он совпадает с read4, то есть основное имя должно совпадать. В моем примере:

Ни один из read1-3 не совпадает с Lawsonia intracellularis, который является частью read4. Таким образом, он может просто напечатать success или failture в файл.

ВЫБОР ВЫБОРКИ

Actinobacillus_pleuropneumoniae_L20
Actinobacillus_pleuropneumoniae_serovar_3_JL03
Actinobacillus_succinogenes_130Z

Lawsonia intracellularis

Failture

Извините, я ошибся насчет 6 чтений, просто нужно 4 на самом деле. Еще раз спасибо за помощь.

1 Ответ

2 голосов
/ 19 марта 2012

Эту проблему можно решить с помощью TXR: http://www.nongnu.org/txr

Хорошо, у меня есть эти примеры файлов (к сожалению, не ваши входные данные):

$ ls -l
total 16
-rwxr-xr-x 1 kaz kaz 1537 2012-03-18 20:07 bac.txr           # the program
-rw-r--r-- 1 kaz kaz  153 2012-03-18 19:16 foo.fna           # file3: genome info
-rw-r--r-- 1 kaz kaz   24 2012-03-18 19:51 foo.fna.map.txt   # file1
-rw-r--r-- 1 kaz kaz  160 2012-03-18 19:56 index.txt         # file2: names of bacteria

$ cat index.txt 
'Actinobacillus_pleuropneumoniae_L20'
'Actinobacillus_pleuropneumoniae_serovar_3_JL03'
'Lawsonia_intracellularis_PHE/MN1-00'
'Actinobacillus_succinogenes_130Z'

$ cat foo.fna.map.txt   # note leading spaces: typo or real?
 13 000
 19 100
 7  200

$ cat foo.fna
gi|94986445|ref|NC_008011.1| Lawsonia intracellularis PHE/MN1-00, complete genome
ATGAAGATCTTTTTATAGAGATAGTAATAAAAAAATGTCAGATAGATATACATTATAGTATAGTAGAGAA

Как видите, я подготовил данные, поэтому на Лоусонии будет матч.

Запустите его:

$ ./bac.txr foo.fna.map.txt 
Lawsonia intracellularis PHE/MN1-00 ATGAAGATCTTTTTATAGAGATAGTAATAAAAAAATGTCAGATAGATATACATTATAGTATAGTAGAGAA

Код следует. Это всего лишь прототип; очевидно, что он должен быть разработан и протестирован с использованием реальных данных. Я сделал несколько предположений, например, как будет выглядеть запись Lawsonia в индексе с прикрепленным к нему кодом.

#!/usr/local/bin/txr -f
@;;; collect the contents of the index fileo
@;;; into the list called index.
@;;; single quotes around lines are removed
@(block)
@  (next "index.txt")
@  (collect)
'@index'
@  (end)
@(end)
@;;; filter underscores to spaces in the index
@(set index @(mapcar (op regsub #/_/ " ") index))
@;;; process files on the command line
@(next :args)
@(collect)
@;;; each command line argument has to match two patterns
@;;; @file1 takes the whole thing
@;;; @file3 matches the part before .map.txt
@  (all)
@file1
@  (and)
@file3.map.txt
@  (end)
@;;; go into file 1 and collect second column material
@;;; over three lines into lineno list.
@  (next file1)
@  (collect :times 3)
 @junk @lineno
@  (end)
@;;; filter lineno list through a function which
@;;; converts to integer, divides by 100 and adds 1.
@  (set lineno @(mapcar (op + 1 (trunc (int-str @1) 100))
                        lineno))
@;;; map the three line numbers to names through the
@;;; index, and bind these three names to variables
@  (bind (name1 name2 name3) @(mapcar index lineno))
@;;; now go into file 3, and extract the name of the
@;;; bacterium there, and the genome from the 2nd line
@  (next file3)
@a|@b|@c|@d| @name, complete genome
@genome
@;;; if the name matches one of the three names
@;;; then output the name and genome, otherwise
@;;; output failed
@  (cases)
@    (bind name (name1 name2 name3))
@    (output)
@name @genome
@    (end)
@  (or)
@    (output)
failed
@    (end)
@  (end)
@(end)
...