#bash #string #file-io
#bash #строка #file-io
Вопрос:
Я пытаюсь выполнить то, что кажется очень простой задачей: использовать bash для поиска строк в файле, и если они существуют, вывести их в другой файл. Это может быть реактивная задержка, но это должно сработать:
#!/bin/bash
cnty=CNTRY
for line in $(cat wheatvrice.csv); do
if [[ $line = *$cnty* ]]
then
echo $line >> wr_imp.csv
fi
done
Я также попробовал это для полноты картины:
#!/bin/bash
cnty=CNTRY
for line in $(cat wheatvrice.csv); do
case $line in
*"$cnty"*) echo $line >> wr_imp.csv;;
*) echo "no";;
esac
done
оба выводят все, независимо от того, содержит строка CNTRY или нет, и я копирую / вставляю из, казалось бы, надежных источников, так что, по-видимому, есть что-то простое в bash-ness, чего мне не хватает?
Комментарии:
1. как бы то ни было, некоторые строки: <br> Бразилия, среднее значение по стране, 1989.428053, 0.875353691, 2899.968733, 531.652993 <br> это те, которые я хочу, а другие <br> Камбоджа, Поутисат,,, 3857.124865, 122.266868 <br> и это не те, которые я хочу
Ответ №1:
Не используйте bash, используйте grep.
grep -F "$cnty" wheatvrice.csv >> wr_imp.csv
Комментарии:
1. возможно, я что-то упускаю, но, похоже, это имеет одинаковый эффект как в скрипте bash, так и непосредственно в терминале.
2. использование grep -F «$cnty» wheatvrice.csv >> wr_imp.csv просто помещает каждую строку из wheatvrice.csv в wr_imp.csv
3. Он устанавливает для нее значение
CNTRY
, возможно, вам следует просто использовать это явно.4. Мне действительно жаль, это просто я сонный, и в Excel (он же моя наименее любимая программа) были вставлены неправильные окончания строк. Поддержано и спасибо.
5. Каким-то образом этот разговор заставил меня смеяться 🙂
Ответ №2:
Хотя я бы предложил также просто использовать grep, вопрос открыт, почему ваш подход не сработал. Вот самореферентная модификация вашего второго подхода — с ключевым словом ‘bash’, чтобы соответствовать самому себе:
#!/bin/bash
cnty=bash
while read -r line
do
case $line in
*${cnty}*)
echo $line " yes" >> bashgrep.log
;;
*)
echo "no"
;;
esac
done < bashgrep.sh
Ключевой точкой является while read -r line ... < FILE
. Ваша команда с помощью cat включает разделение строк, поэтому в цикле обрабатывается каждое отдельное слово, а не каждая строка.
Та же проблема в примере 1.