Сравнение всех столбцов в файле со ссылочным столбцом в том же файле

#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’, было бы возможно сделать это так?