Если два столбца частично совпадают, замените третий на awk

Файл a.txt

chr:1:10539:A:C 10539 C A 0.545987 0.508902  0 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746  0 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746  0 0.733423 + 1

Файл b.txt

1 4972
2 4972
3 4972
7 4970

Я ищу способ найти частичное совпадение между $1 из a.txt и $1 b.txt и заменить $7 в a.txt на соответствующие $2 из b.txt.

Так что результат будет выглядеть как

chr:1:10539:A:C 10539 C A 0.545987 0.508902  4972 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746  4972 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746  4970 0.733423 + 1

Спасибо за любую помощь.

1
задан 15 January 2018 в 12:05

1 ответ

Подход awk:

$ awk 'NR==FNR{a[$1]=$2; next} {split($1,b,/:/); $7=a[b[2]]}1;' b.txt a.txt 
chr:1:10539:A:C 10539 C A 0.545987 0.508902 4972 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746 4972 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746 4970 0.733423 + 1

Объяснение

  • NR==FNR{a[$1]=$2; next}: NR - номер строки текущей строки ввода, а FNR - номер текущей строки текущего файла. Два будут равны только при чтении 1-го файла. Следовательно, это сохранит информацию из b.txt в массиве a, индексами которого являются хромосомы из b.txt, а значениями являются связанные числа. next переходит к следующей строке и гарантирует, что второй блок не запускается для b.txt.

  • split($1,b,/:/); $7=a[b[2]]: это будет выполняться только для a.txt. Сначала он разбивает 1-е поле на : на массив b. Таким образом, вторым элементом в b будет хромосома. Затем он устанавливает седьмое поле файла в соответствии с тем, что было сохранено в массиве a для хромосомы, хранящейся в b[2] (вот что означает a[b[2]]: a[ b[2] ]).

  • 1;: это сокращение от awk для «print this line».

0
ответ дан 15 January 2018 в 12:05

Другие вопросы по тегам:

Похожие вопросы: