bash поиск строки в каждой строке файла - PullRequest
11 голосов
/ 17 апреля 2011

Я пытаюсь выполнить очень простую задачу: использовать 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, которое я пропускаю?

Ответы [ 2 ]

27 голосов
/ 17 апреля 2011

Не используйте bash, используйте grep.

grep -F "$cnty" wheatvrice.csv >> wr_imp.csv
3 голосов
/ 18 апреля 2011

Хотя я бы посоветовал просто использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...