String 从大文本文件中提取字符
这里的第一个问题,所以要友善…:) 我有一个大的文本文件(asdf.rep),我需要搜索很多数字,我把它放在一个列表txt文件(list.txt)中 my list.txt的外观如下所示: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
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
这告诉awk首先读取文件list.txt RS=”“asdf.rep
。它以默认方式读取:逐行读取list.txt
告诉awk一次读取一个段落的下一个文件RS=”“
告诉awk下一步读取哪个文件asdf.rep
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
这告诉awk首先读取文件list.txt RS=”“asdf.rep
。它以默认方式读取:逐行读取list.txt
告诉awk一次读取一个段落的下一个文件RS=”“
告诉awk下一步读取哪个文件asdf.rep