2014-02-09 4 views
0

У меня есть текстовый файл с большим количеством строк в этом формате (линии между каждыми двумя # определяется как группа):держать группы линий с определенными ключевыми словами (Баш)

# some str for test 
hdfv 12 9 b 
cgj 5 11 t 
# another string to examine 
kinj 58 96 f 
dfg 7 26 u 
fds 9 76 j 
--- 
key.txt: 
string to 
--- 
output: 
# another string to examine 
kinj 58 96 f 
dfg 7 26 u 
fds 9 76 j 

Я должен искать некоторые ключевые слова (string, to) из строк, начинающихся с #, и если ключевые слова не существуют в key.txt (файл с двумя столбцами), тогда я должен удалить эту строку и следующие строки (из этой группы). Я написал это код без результата! (ключевые слова объединены во входном файле в качестве примера)

cat input.txt | while IFS=$'#' read -r -a myarray 
do 
a=${myarray[1]} 
b=${myarray[0]} 
unset IFS 
read -r a x y z <<< "$a" 
key=$(echo "$x $y") 
if grep "$key" key.txt > /dev/null 
then 
echo $key exists 
else 
grep -v -e "$a" -e "$b" input.txt > $$ && mv $$ input.txt 
fi 
done 

Может кто-нибудь мне помочь?

ответ

0

Простой способ получить правильный блок использует awk и правильно Record Selector:

awk 'FNR==NR {a[$0];next} { RS="#";for (i in a) if ($0~i) print}' key.txt input.txt 
another string to examine 
kinj 58 96 f 
dfg 7 26 u 
fds 9 76 j 

Это должно повторно вставить #, который используется и удалить лишнюю пустую строку. Я могу быть более простым способом сделать это, но это работает.

awk 'FNR==NR {a[$0];next} { RS="#";for (i in a) if ($0~i) {sub(/^ /,RS);sub(/\n$/,x);print}}' key.txt input.txt 
#another string to examine 
kinj 58 96 f 
dfg 7 26 u 
fds 9 76 j 
+0

Обновлен нам данные из 'key.txt' – Jotne

+0

Добавлена ​​второго ответа исправить недостающую' '# и удалить дополнительные пустые строки. Где удаленные пробелы? – Jotne

Смежные вопросы