Вам нужно добавить -w
, чтобы соответствовать только целым словам. Поскольку у вас нет шаблонов, а есть фиксированная строка, вы можете добавить -F
.
$ grep -wFf file1 file2
chr10 31120 A T Descriptions
Другим хорошим инструментом для этого задания является join
, но по умолчанию он печатает сначала поле join
, а затем остальные поля, что может вам не нравиться:
$ join -2 2 file1 file2
31120 chr10 A T Descriptions
-2 2
означает, что поле соединения для второго файла равно 2.
Имейте в виду, что для join
входные данные должны быть лексически отсортированы по полю соединения. Если они еще не отсортированы и если ваша оболочка поддерживает подстановку процессов (AT&T ksh, zsh, bash ), вы можете сделать:
join -2 -2 <(sort -k1,1 file1) <(sort -k2,2 file2)
Знаки доллара используются make, поэтому вам нужно экранировать их, если вы хотите, чтобы они передавались оболочке. Вы делаете это, удваивая их.
test:
@bash -c "\
echo 'need to run some program before assigning env variable';\
echo 'The make CC variable is set to :${CC}:';\
export TEST=\"\$$(date)\";\
echo 'printing env';\
echo \$${TEST};\
"
testwithout:
@echo 'need to run some program before assigning env variable';\
echo 'The make CC variable is set to :${CC}:';\
export TEST="$$(date)";\
echo 'printing env';\
echo $${TEST};
Другие проблемы вызваны двойной интерпретацией строки. make
берет рецепт, преобразует обратную косую черту последовательности в новую строку и передает результат оболочке для выполнения. Поскольку вы используете двойные кавычки для своего bash -c ".... "
, это приводит к тому, что оболочка расширяет знаки доллара, поэтому вы получаете `bash -c "echo 'need...' ;export TEST=Mon Sep...; эхо ;". Добавление некоторых символов обратной косой черты защищает знаки доллара и внутренние двойные кавычки.
Вероятно, нет необходимости использовать bash -c
. как показано в тесте без цели. Вам все равно нужно построить команду как одну строку.Gnu make имеет возможность .ONESHELL
использовать одну оболочку для выполнения рецепта, а не одну оболочку на логическую строку, что позволяет избежать искажений.