#awk
#awk
Вопрос:
У меня есть файл табуляции (SNPs-файл) в этом формате:
Расположение -> Ссылочный образец-> sample1-> sample2-> sample3-> etc
Location Reference Sample1 Sample2 Sample3
1_56 T A G C
1_226 A A C G
1_670 G T G G
Цель состоит в том, чтобы создать цикл, в котором каждое выборочное значение сравнивается с эталонным значением. Если это не соответствует, мне нужно, чтобы строка и столбец были распечатаны для каждого образца. Это то, что я придумал:
awk '$2 != $3 amp;amp; $3 != "." { print $1 $2 $3 }' ~FILEPATH/All_SNPs_annotated.txt >> sample1_SNPs_ready
Формат, который это выводит, по сути, представляет собой список всех экземпляров, которым столбец 3 не соответствует, ссылочный столбец и местоположение, которые не совпадают для одного примера, подобного этому:
LocationReferenceSample1
1_56TA
1_670GT
LocationReferenceSample2
1_56TG
1_226AC
LocationReferenceSample3
1_56TC
1_226AG
Но каждый образец создает свой собственный файл.
Проблема в том, что мне приходится вручную изменять значение в 3 доллара для перемещения по столбцу — есть ли способ сделать это так, чтобы он выполнял цикл по каждому столбцу самостоятельно? Это работает, если у меня есть четыре образца, однако теперь у меня более 300, что делает это немного неосуществимым.
что позволяет получить нужные мне столбцы. я предполагаю, что мне нужно создать цикл, который сообщает ему пройти по столбцам, а затем в этом цикле добавить команду awk, аналогичную приведенной выше.
Но это не выводит отдельный файл для каждого образца.
Я обновил информацию, так что, надеюсь, теперь она более полезна.
Комментарии:
1. Не могли бы вы, пожалуйста, предоставить более четкие (например, указать все значения, которые необходимо напечатать для несовпадающих) ожидаемые результаты в вашем вопросе, и дайте нам знать тогда. Это сделает вопрос более понятным.
2. Привет, Равиндер, я добавил еще немного информации, так что, надеюсь, это более понятно.
Ответ №1:
awk 'NR == 1 {
split($0, names)
}
{
for (s = 3; s <= NF; s ) {
if ($s != $2 amp;amp; $s != ".") {
print $1 $2 $s > names[s]
}
}
}' file
$ tail -n 1 Sample*
==> Sample1 <==
LocationReferenceSample1
1_56TA
1_670GT
==> Sample2 <==
LocationReferenceSample2
1_56TG
1_226AC
==> Sample3 <==
LocationReferenceSample3
1_56TC
1_226AG
Комментарии:
1. Это именно то, что мне было нужно! Чтобы сделать еще один шаг вперед, можно ли изменить имя выходного файла на заголовок столбца? ie; если бы ‘sample1’ был ‘xxx’ или ‘rrr’, было бы возможно сделать это так?