保持具有特定关键字的行组(bash)

时间:2014-02-09 04:56:19

标签: linux search sed grep

我有一个文本文件,这个格式有很多行(每两个#之间的行被定义为一个组):

# 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

我应该从以#开头的行搜索一些关键字(字符串,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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

获取正确阻止的一种简单方法是使用awk并更正记录选择器:

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