Grep строка с точным соответствием с пробелами в качестве переменной - PullRequest
1 голос
/ 15 марта 2019

у меня есть:

file.csv

Который содержит

2,1,"string with spaces",3,4,5
2,1,"some other string",3,4,5
2,1,"string with spaces more than this",3,4,5
2,1,"yet another",3,4,5
2,1,"string with spaces too",3,4,5

Когда я делаю это:

grep '"string with spaces",' file.csv

Он производит желаемый результат, который:

2,1,"string with spaces",3,4,5

Теперь мне нужно сделать это в цикле while:

while read p; do

    grep '"$p",' file.csv

done < list.txt

Где:

list.txt

содержит:

string with spaces
yet another

И мой желаемый результат:

2,1,"string with spaces",3,4,5
2,1,"yet another",3,4,5

Проблема в том, что мой цикл while возвращается пустым или частично совпадает. Как мне пройти через list.txt и получить желаемый результат?

Ответы [ 3 ]

4 голосов
/ 15 марта 2019

Если вы в порядке с awk, это должно быть легко для него.

awk 'FNR==NR{a[$0];next} ($4 in a)' list.txt FS="[,\"]" file.csv

ИЛИ (согласно комментарию Эда сэра, чтобы разделитель полей был запятым и чтобы он был понятнее, можно попробовать следующее)

awk -F, 'FNR==NR{a["\""$0"\""];next} $3 in a' list.txt file.csv

Вывод будет следующим.

2,1,"string with spaces",3,4,5
2,1,"yet another",3,4,5
2 голосов
/ 15 марта 2019

Все строки в кавычках используют одинарные кавычки ', которые не выполняют никакой интерполяции переменной $p. Изменение на grep '"'"$p"'",' file.csv решит проблему. Ключевым моментом является то, что здесь интерполяция переменной выполняется внутри двойных кавычек ", а затем объединяется со строками, содержащими действительные двойные кавычки " символов.

Более (или менее, в зависимости от вашей точки зрения) читаемая версия может выглядеть следующим образом: grep "\"$p\"," file.csv

0 голосов
/ 16 марта 2019
 grep -Ff strings.txt file.csv

Это должно вывести вас достаточно далеко.

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