Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 从大文本文件中提取字符_String_Grep - Fatal编程技术网

String 从大文本文件中提取字符

String 从大文本文件中提取字符,string,grep,String,Grep,这里的第一个问题,所以要友善…:) 我有一个大的文本文件(asdf.rep),我需要搜索很多数字,我把它放在一个列表txt文件(list.txt)中 my 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 da

这里的第一个问题,所以要友善…:)

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

my 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
然后,我需要在一个大文件中找到这些数字,其中包含以下内容:

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
这显示了我的数字键和上面的25行,然后我的问题是:

是否有其他方法仅显示数字键和“数字2”

差不多

number key 555555 number2 789789

number key 123456 number2 789791

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

grep | sed(读“grep pipe sed”或“grep through sed”)是一个常见的序列:人们通常希望(a)找到匹配的行,然后(b)对这些行执行一些文本转换

我不知道为什么要使用-B4标志来选择周围的上下文。那不是一件很简单的事。如果您在几行之间打断的行(“数字2等等…数字键等等”)实际上对应于单行文本(以换行符“\n”结尾),则几乎不需要显示周围的上下文

在grep命令的末尾,添加以下字符:

| sed's/number2\([^]*\).\(数字键\)/\1\2/'

指定后,字符串显示为单引号s斜杠数字2空格反斜杠左括号左括号回旋空格右括号星形反斜杠右括号点星形反斜杠左括号数字空格键反斜杠右括号斜杠反斜杠一空格反斜杠两个单引号


这个复杂的字符串(对空格和反斜杠等要格外小心)删除了数字后面的所有内容(比如你的例子中的789791),最多包括但不包括单词“number key”。

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

grep | sed(读“grep pipe sed”或“grep through sed”)是一个常见的序列:人们通常希望(a)找到匹配的行,然后(b)对这些行执行一些文本转换

我不知道为什么要使用-B4标志来选择周围的上下文。那不是一件很简单的事。如果您在几行之间打断的行(“数字2等等…数字键等等”)实际上对应于单行文本(以换行符“\n”结尾),则几乎不需要显示周围的上下文

在grep命令的末尾,添加以下字符:

| sed's/number2\([^]*\).\(数字键\)/\1\2/'

指定后,字符串显示为单引号s斜杠数字2空格反斜杠左括号左括号回旋空格右括号星形反斜杠右括号点星形反斜杠左括号数字空格键反斜杠右括号斜杠反斜杠一空格反斜杠两个单引号

这个复杂的字符串(对空格和反斜杠等要格外小心)会删除数字后面的所有内容(如您的示例中的789791),包括但不包括“数字键”字样。请尝试以下操作:

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
以及:

运行我们的代码:

$ 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
    中的键。然后我们跳过其余的命令,跳转到下一行

  • (a中的$NF){打印“数字键”、$NF、$1、$2}

    如果我们到了这里,我们正在读取第二个文件,
    asdf.rep
    。我们一次读一段。如果段落中的最后一个数字与
    a
    中的任何键匹配,则我们打印输出

  • list.txt RS=”“asdf.rep

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

    RS=”“
    告诉awk一次读取一个段落的下一个文件

    asdf.rep
    告诉awk下一步读取哪个文件

试试这个:

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
以及:

运行我们的代码:

$ 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
    中的键。然后我们跳过其余的命令,跳转到下一行

  • (a中的$NF){打印“数字键”、$NF、$1、$2}

    如果我们到了这里,我们正在读取第二个文件,
    asdf.rep
    。我们一次读一段。如果段落中的最后一个数字与
    a
    中的任何键匹配,则我们打印输出

  • list.txt RS=”“asdf.rep

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

    RS=”“
    告诉awk一次读取一个段落的下一个文件

    asdf.rep
    告诉awk下一步读取哪个文件


与AWK解决方案相比,我更倾向于使用SED解决方案,因为(a)许多读者不熟悉AWK,以及(b)与AWK相关的设置和拆卸非常多。别管眼泪了,你已经哭了