Создать переменную, объединив текст + другую переменную

Короче говоря, я пытаюсь найти значение, содержащееся в первом столбце текстового файла, с помощью переменной.

Вот пример сценария с командой grep, которая не работает:

for ii in `cat list.txt`
do
    grep '^$ii' >outfile.txt
done

Содержимое list.txt:

123,"first product",description,20.456789
456,"second product",description,30.123456
789,"third product",description,40.123456

Если я выполню grep '^123' list.txt, он выдаст правильный результат ... Только первая строка list.txt.

Если я попытаюсь использовать переменную (т.е. grep '^ii' list.txt), я получаю ошибку «^ ii command not found». Я попытался объединить текст с переменной, чтобы заставить ее работать:

VAR1= "'^"$ii"'"

но переменная VAR1 содержала возврат каретки после переменной $ii:

'^123
'

Я пробовал подробный список вещей, чтобы удалить cr / lr (например, sed и awk), но безрезультатно. Должен быть более простой способ выполнить команду grep с помощью переменной. Я бы предпочел остаться с командой grep, потому что она отлично работает при выполнении вручную.


person Joe Koz    schedule 28.05.2016    source источник
comment
Также покажите желаемый результат.   -  person John1024    schedule 28.05.2016
comment
Спасибо за ответы! В этом случае желаемый результат - это только первая строка файла. По сути, я хочу, чтобы grep выполнял поиск в первом столбце и игнорировал остальные столбцы. Если grep используется без флагов, будет отображаться каждая строка файла.   -  person Joe Koz    schedule 29.05.2016


Ответы (1)


Вы перепутали команду grep '^ii' list.txt. Символ ^ обозначает начало строки, а $ - значение переменной. Если вы хотите ввести 123 в переменной ii в начале строки, используйте

ii="123"
grep "^$ii" list.txt

(Здесь вы должны использовать двойные кавычки)
Хороший момент для изучения хороших привычек: продолжайте в именах переменных в нижнем регистре (хорошо сделано) и используйте фигурные скобки (не причиняйте вреда и необходимы в других случаях):

ii="123"
grep "^${ii}" list.txt

Теперь мы оба кое-что забываем: наш grep также будет соответствовать 1234,"4-digit product",description,11.1111. Включите , в grep:

ii="123"
grep "^${ii}," list.txt

А как вы получили ошибку "^ ii command not found"? Я думаю, вы использовали обратные кавычки (старый способ вложения команды, лучше echo "example: $(date)"), и вы написали

grep `^ii` list.txt # wrong !
person Walter A    schedule 28.05.2016
comment
Спасибо, Уолтер, это помогло! В дополнение к вашему ответу я обнаружил, что мне нужно выполнить dos2unix для файла list.txt, потому что он был создан в Windows. Спасибо всем, кто ответил !!! - person Joe Koz; 29.05.2016