从大文本文件中提取字符

时间:2016-08-02 21:31:53

标签: string grep

这里的第一个问题,所以要好......:)

我有一个大文本文件(asdf.rep),我需要搜索很多数字,我把它放在列表txt文件(list.txt)

我的list.txt看起来像这样:

123456
555555
888888
123456

然后,我需要在包含类似内容的大文件中找到这些数字:

number2 789789
assasaasjalsjkalksjlkaj
data data data data data data data data data data data data data data data
data data data data data data data data data data data data data data  data data data data
number key 555555

number2 789791
assasaasjalsjkalksjlkaj
data data data data data data data data data data data data data data data
data data data data data data data data data data data data data data  data data data data
number key 123456

我使用grep -f从列表中搜索,

grep -f list.txt -B4 asdf.rep

这显示了我的数字键和数字2 5行,然后我的问题是:

还有其他方法只显示数字键和“number2”吗?

类似

number key 555555 number2 789789

number key 123456 number2 789791

2 个答案:

答案 0 :(得分:1)

如果您使用grep选择匹配的行,您还可以使用sed“hack up”grep报告的行。在UNIX中,您可以在“管道”中将两个或多个命令联合起来,其中每个命令的输出都作为输入提交给下一个,以便序列中的每个工具都可以执行自己的转换任务。

grep | sed(读取“grep pipe sed”或“grep through sed”)是一个常见的序列:人们经常想要(a)找到匹配的行,然后(b)在行上执行一些文本转换。

我不确定你为什么要使用-B4标志来选择周围的上下文。这不是一个非常UNIX的事情。如果你突破几行的行(“number2 blah blah ...数字键blah”)实际上对应于文本的单行 - 由换行符终止,'\ n' - 几乎不需要显示周围环境。

在grep命令结束时,添加以下字符:

<强> | sed's / number2 \([^] * \)。* \(数字键\)/ \ 1 \ 2 /'

Dictated,字符串读取单引号s斜线number2空格反斜杠左括号左括号circumflex空间右括号星反斜杠右括号点星反斜杠左括号数字空格键反斜杠右括号反斜杠一空格反斜杠单引号< /强>

那个复杂的字符串(对于空格和反斜杠等是非常小心的)会删除跟随数字的所有内容(如示例中的789791),但不包括“数字键”这几个字。

答案 1 :(得分:1)

试试这个:

awk 'FNR==NR{a[$1]; next} ($NF in a){print "number key",$NF,$1,$2}' list.txt RS="" asdf.rep

实施例

让我们使用这两个文件作为输入:

$ cat list.txt
123456
555555
888888
123456

$ cat asdf.rep
number2 789789
assasaasjalsjkalksjlkaj
data data data data data data data data data data data data data data data
data data data data data data data data data data data data data data  data data data data
number key 555555

number2 789791
assasaasjalsjkalksjlkaj
data data data data data data data data data data data data data data data
data data data data data data data data data data data data data data  data data data data
number key 123456

运行我们的代码:

$ awk 'FNR==NR{a[$1]; next} ($NF in a){print "number key",$NF,$1,$2}' list.txt RS="" asdf.rep
number key 555555 number2 789789
number key 123456 number2 789791

如何运作

  • FNR==NR{a[$1]; next}

    当我们读到由FNR==NR表示的第一个文件时,我们将每行上的数字添加为关联数组a中的键。然后我们跳过其余的命令并跳转到next行。

  • ($NF in a){print "number key",$NF,$1,$2}

    如果我们到达此处,我们正在阅读第二个文件asdf.rep。我们一次读一个段落。如果段落中的最后一个数字与a中的任何键匹配,那么我们打印输出。

  • list.txt RS="" asdf.rep

    这告诉awk首先读取文件list.txt。它以默认方式读取:逐行。

    RS=""告诉awk一次读一个段落的下一个文件。

    asdf.rep告诉awk接下来要读哪个文件。