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

Насколько я видел, нет конвенции. Если вы разрабатываете программу / скрипт, вам решать, как обрабатывать заказ. Например, команда find выдаст предупреждение, если я поместил аргумент, связанный с каталогом, после аргумента, связанного с именованием.

$ find /etc -iname "passwd" -maxdepth 1
find: warning: you have specified the -maxdepth option after a non-option argument -iname, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

/etc/passwd

Другим программам может не нравиться заказ. У меня есть простой скрипт getopts.sh, который я поддерживаю, когда мне нужно использовать аргументы командной строки в другом скрипте, и он анализирует аргументы в определенном порядке

$ getopts.sh  test1 -w1 test2                                                 
Hello, I'm main
The arguments are  test1 -w1 test2
1
задан 15 January 2018 в 13:05

2 ответа

Подход 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 и значениями которых являются связанные числа. [F9] переходит к следующей строке и гарантирует, что второй блок не будет запущен для b.txt. split($1,b,/:/); $7=a[b[2]]: это будет выполняться только для a.txt. Во-первых, он разбивает 1-е поле на : на массив b. Таким образом, вторым элементом b будет хромосома. Затем он устанавливает 7-е поле файла, которое было сохранено в массиве a для хромосомы, сохраненной в b[2] (это означает, что a[b[2]] означает: a[ b[2] ]). 1;: это сокращение от awk для "print this line".
0
ответ дан 17 July 2018 в 23:01

Подход 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 и значениями которых являются связанные числа. [F9] переходит к следующей строке и гарантирует, что второй блок не будет запущен для b.txt. split($1,b,/:/); $7=a[b[2]]: это будет выполняться только для a.txt. Во-первых, он разбивает 1-е поле на : на массив b. Таким образом, вторым элементом b будет хромосома. Затем он устанавливает 7-е поле файла, которое было сохранено в массиве a для хромосомы, сохраненной в b[2] (это означает, что a[b[2]] означает: a[ b[2] ]). 1;: это сокращение от awk для "print this line".
0
ответ дан 24 July 2018 в 13:34

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

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