Мой вопрос не так просто спросить, я пытаюсь объяснить проблему следующим примером:Counting результат Grep не будет работать в Баш скрипт
/home/luther/tipical_surnames.txt
Smith
Johnson
Williams
Jones
Brown
#Davis
Miller
Wilson
#Moore
Taylor
Anderson
/дома /luther/employers.txt
2000 Johnson A lot-of details/BJC3000,6000, i550 0
2101 Smith A lot-of details/BJC3000,6000, i550 0
2102 Smith A lot-of details/BJC3000,6000, i550 0
2103 Jones A lot-of details/BJC3000,6000, i550 0
2104 Johnson A lot-of details/BJC3000,6000, i550 0
2100 Smith A lot-of details/BJC3000,6000, i550 0
у меня есть список с любимыми фамилиями и другим с именем работодателей. Давайте посмотрим, сколько людей имеют самую популярную фамилию в компании, с помощью консоли:
grep -v "#" /home/luther/tipical_surnames.txt | sed -n 1'p' | cut -f 1
Smith
grep Smith /home/luther/employers.txt | wc -l
230
отработаны. Теперь давайте проверить первые 5 самых популярных фамилий с помощью простой Баш скрипт:
#!/bin/bash
counter=1
while [ $counter -le 5 ]
do
surname=`grep -v "#" /home/luther/tipical_surnames.txt | sed -n "$counter"'p' | cut -f 1`
qty=`grep "$surname" /home/luther/employers.txt | wc -l`
echo $surname
echo $qty
counter=$(($counter + 1))
done
И результат в следующем:
Smith
0
Johnson
0
Williams
0
Jones
0
Brown
0
Что не так?
Обновление: Как я уже писал, я тестировал скрипт на другом компьютере, и все работает нормально. После я стараюсь следовать:
[email protected]:/var/www# cat testfile.bash
#!/bin/bash
for ((c=1; c<=5; c++))
{
echo $c
}
[email protected]:/var/www# bash testfile.bash
testfile.bash: line 2: syntax error near unexpected token `$'\r''
'estfile.bash: line 2: `for ((c=1; c<=5; c++))
[email protected]:/var/www# echo $BASH_VERSION
4.2.37(1)-release
[email protected]:/var/www#
Конечно, на другом компьютере, это просто сценарий работы, как и ожидалось, без ошибок.
Оболочка - это среда, из которой можно вызвать инструменты, а не инструмент для манипулирования текстом. Стандартный, универсальный UNIX-инструмент для управления текстом - awk. Вы боретесь, потому что используете неправильный инструмент, и это было бы чрезвычайно сложно и неэффективно для того, чтобы делать то, что вы хотите надежно в оболочке (см. [Why-is-use-a-shell-loop-to-process-text- считается, плохая практика] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)). Бросьте его и начинайте с awk. Опубликуйте краткий, проверяемый ввод проб и ожидаемый результат, и мы можем вам помочь. –
Я думаю, у вас есть файл с терминаторами линии DOS. Вы не видите их при копировании/вставке программы, но они будут присутствовать в захваченной переменной и не позволят окончательному 'grep' что-либо совместить. Попробуйте 'dos2unix' в файлах. Для дальнейшего устранения неполадок в [Stack Overflow 'bash' tag wiki] (// stackoverflow.com/tags/bash/info) содержится подробный раздел об этой проблеме. – tripleee
@ Ed Morton Хорошо, это ясно, но я до сих пор не понимаю, почему мой код будет хорошим, если я заменил переменную $ surname на значение. Как видно из результата, переменная $ surname имеет хорошее значение, когда я хочу распечатать ее на экране. Почему одна и та же переменная не работает, когда я использую объявление переменной $ qty? – Luther