Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Regex 如何在300GB.txt文件上使用awk和grep?_Regex_Unix_Awk_Grep_Large Files - Fatal编程技术网

Regex 如何在300GB.txt文件上使用awk和grep?

Regex 如何在300GB.txt文件上使用awk和grep?,regex,unix,awk,grep,large-files,Regex,Unix,Awk,Grep,Large Files,我有一个巨大的.txt文件,更准确地说是300GB,我想把第一列中与我的模式匹配的所有不同字符串放在一个不同的.txt文件中 awk '{print $1}' file_name | grep -o '/ns/.*' | awk '!seen[$0]++' > test1.txt 这是我尝试过的,据我所知,它工作正常,但问题是,经过一段时间后,我出现以下错误: awk: program limit exceeded: maximum number of fields size=32767

我有一个巨大的.txt文件,更准确地说是300GB,我想把第一列中与我的模式匹配的所有不同字符串放在一个不同的.txt文件中

awk '{print $1}' file_name | grep -o '/ns/.*' | awk '!seen[$0]++' > test1.txt
这是我尝试过的,据我所知,它工作正常,但问题是,经过一段时间后,我出现以下错误:

awk: program limit exceeded: maximum number of fields size=32767
    FILENAME="file_name" FNR=117897124 NR=117897124

有什么建议吗?

字段数是输入文件中的“列”数,因此如果其中一行很长,则可能会导致此错误

我怀疑
awk
grep
步骤可以组合成一个:

sed -n 's/\(^pattern...\).*/\1/p' some_file | awk '!seen[$0]++' > test1.txt
awk 'BEGIN{FS=RS} {sub(/[[:space:]].*/,"")} /\/ns\// && !seen[$0]++' file_name

这可能完全避免了
awk
问题(即
sed
命令替换与模式匹配的任何前导文本,以代替整行,如果匹配,则打印该行).

在我看来,您的
awk
实现对一次
117897124
读取的记录数有一个上限。限制可能因您的实现和操作系统而异

解决此问题的一个明智方法可能是编写一个自定义脚本,使用
split
将大文件拆分为较小的文件,每个记录不超过
100000000



如果您不想分割文件,那么您可以查找与
awk
实现相对应的
限制
文件。也许您可以将
unlimited
定义为记录数值,尽管我认为这不是一个好主意,因为您可能会使用大量资源

如果磁盘上有足够的可用空间(因为创建了一个temp.swp文件),我建议使用Vim,Vim regex差别不大,但您可以使用此工具将标准regex转换为Vim regex

错误消息告诉您:

line(117897124) has to many fields (>32767).
你最好去看看:

sed -n '117897124{p;q}' file_name

使用
cut
提取第一列:

cut -d ' ' -f 1 < file_name | ...
cut-d'-f1

注意:您可以将
''
更改为任何字段分隔符。默认值为
$'\t'

错误消息表示输入文件包含的字段太多,不适合awk实现。只需将字段分隔符更改为与记录分隔符相同,并且每行只有一个字段,因此避免了该问题,然后将其余命令合并为一个:

sed -n 's/\(^pattern...\).*/\1/p' some_file | awk '!seen[$0]++' > test1.txt
awk 'BEGIN{FS=RS} {sub(/[[:space:]].*/,"")} /\/ns\// && !seen[$0]++' file_name
如果出现问题,请尝试:

awk 'BEGIN{FS=RS} {sub(/[[:space:]].*/,"")} /\/ns\//' file_name | sort -u

可能有一个更简单的解决方案,但由于您没有发布任何示例输入和预期输出,我们只是猜测。

可能是自定义脚本?您能给我们一些文件中的示例行吗?也许可以将第三步替换为
sort
uniq
,而不是尝试在内存中执行。在
grep
之后的文件有多大?请。您的问题对于堆栈溢出和溢出都可以,但选择一个+1表示拆分。这个问题似乎很容易被拆分和重新组合。这应该可以解决,但我想知道是否有一种方法可以在不拆分文件的情况下实现这一点:)@JovanAndonov-明白。检查我的编辑;)根据您的
awk
实现,该文件可能位于不同的位置,因此我想您必须查看您的
awk
手册才能找到它的位置。我希望这有帮助!限制在字段上,而不是记录上。拆分文件没有用。我有足够的可用空间。所以你能给我解释一下或者给我指一个关于vim的很好的教程吗?我很难让它工作。因此,为了确保我们在同一页上,我想从文件第一列的所有行中获取与我的模式匹配的部分行,并且我还想删除重复项。这就是/(^pattern…。*/\1/p)某些文件所做的吗?如果是这样,请您帮助我使用以下模式/ns/*?第一个命令(
sed
)旨在用匹配的内容替换完整的行,其中包括与您的模式(即
\(…\)
)相匹配的内容(表示
\(…\)
内容的
\1
),并用
/p
打印出更改的行。如果没有匹配项,则不会打印。因此,此命令仅打印包含匹配项的行,并且这些行已被替换为仅包含匹配的文本。如果要查找的文本是以
ns
开头的字段1,则这将是
s/\(^ns[^]*\).*/\1/p
好吧……到目前为止还不错!:)我还没有收到错误,它也在按预期处理文件。完成后,我会告诉你这是否有效。