поиск bash строки в каждой строке файла

#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.