0

好吧,所以我无法弄清楚这一点。就像我使用 grep 来获取某些信息的文件一样,它的设置是这样的。

#aaaa
<numbers 123456>

blah
blah
blah

#bbbb
<numbers 2156488>

blah
blah
blah

#cccc
<numbers 5478624>

blah
blah
blah

我正在做的是我正在寻找aaaabbbbcccc我真正需要的信息是数字。就像当我 grep 时aaaa我想要获得的东西实际上只是它下面的数字。在这种情况下,它会123456

我知道如何 grep foraaaa但我不知道如何转到下一行并减少数字。

4

6 回答 6

5

Using sed:

sed -n '/aaaa/{
N
s/[^0-9]*\([0-9]*\).*/\1/p
}' input_file
于 2012-07-20T15:26:03.130 回答
4

您可以使用-C选项grep来显示一行上下文。然后您可以tail在最后一行 ( -n 1),cut使用空格并选择第二个字段,cut再次使用>并选择第一个字段。因此:

$ grep aaaa file -C 1 | tail -n 1 | cut -f2 -d' ' | cut -d'>' -f1
123456

将返回您请求的号码。

最重要的部分是-C选项grep

于 2012-07-20T15:14:10.400 回答
2

对我来说,这更像是一份工作sed

sed -n '/^#[a-z]\{4\}/{ N; s/#.*\n<numbers //; s/>//p; }'

说默认情况下-n不打印。/^#[a-z]\{4\}/看起来#aaaa像; 里面的动作{ ... }只适用于这样的行。意思是“N阅读下一行”;第一个s///删除数字之前的材料;第二个删除尾随>和打印。

关于如何执行“删除无关材料”还有其他选项,例如只有一个替代命令s/[^0-9]*\([0-9][0-9]+\).*/\1/:这将捕获第一个数字字符串并删除其他所有内容。它将比最初显示的更受约束的正则表达式处理更多的输入变化。

样本数据的输出:

123456
2156488
5478624

这不会自动成为sed; 更改它,以便有趣的信息是比赛后的第三行,并且它会变得很复杂sed(尽管N;N;N;可能是想要的)。

于 2012-07-20T15:22:34.367 回答
0

@ Lars Kotthoff

Your suggestion to use the -A 1 option worked perfectly!

The answer using your input is this:

grep "aaaa" file -A 1 | grep "<numbers" | cut -d" " -f2 | cut -d">" -f1

I would love to give you the credit for this one!

于 2012-07-20T15:23:59.087 回答
0

试试这个:

for i in "aaaa bbbb"
do
sed -n '/'"$i"'/,+1 p' test |tail -n1|cut -d' ' -f2| sed 's/.$//'
done

它的效率不是很高,但做得很好。

于 2012-07-20T18:17:42.703 回答
0

如果你不是坚持grep
+0要去掉“>”

awk 'f{print $2+0; exit} /^#aaaa/{f=1}' foo.txt

或者

awk 'f{print $2+0; f=0} /^#aaaa/{f=1}' foo.txt
于 2012-07-20T16:28:36.387 回答