Файл 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
Спасибо за любую помощь.
Подход 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».