awk无法读取大文件的内容

awk无法读取大文件的内容,awk,gawk,nawk,Awk,Gawk,Nawk,我是awk的新手,我正在编写一个脚本来读取一个文件的内容并处理它,然后根据结果将结果附加到几个文件中。该脚本在包含大约100行的文件上工作,但在包含125k行的文件上失败。我很困惑这是否是我在这里做事的方式的问题,因为我看到awk可以很好地处理较大的文件 这是我的代码:filespliting.awk BEGIN { print "Splitting file ";} { print NR; r=int($2/1024); if(r>5){ print $0 >> "testF

我是awk的新手,我正在编写一个脚本来读取一个文件的内容并处理它,然后根据结果将结果附加到几个文件中。该脚本在包含大约100行的文件上工作,但在包含125k行的文件上失败。我很困惑这是否是我在这里做事的方式的问题,因为我看到awk可以很好地处理较大的文件

这是我的代码:filespliting.awk

BEGIN { print "Splitting file ";} { print NR; r=int($2/1024); if(r>5){ print $0 >> "testFile";} if(r<=5){ print $0 >> "testFile2";} } END { print "Done"; }

问题是您使用了错误的输出重定向操作符。您应该使用
>
而不是
>
。Awk与shell wrt这两个运算符的行为不同。了解这些操作符在awk中的工作方式,并将脚本更改为:

BEGIN { print "Splitting file ";} { print NR; r=int($2/1024); if(r>5){ print $0 > "testFile";} if(r<=5){ print $0 > "testFile2";} } END { print "Done"; }
您不需要在每次写入后关闭文件

针对@Aryan在下面的评论,以下是
>
awk与壳牌的等价物:

1) awks
>

awk:
    { print > "foo" }

shell equivalent:

    > foo
    while IFS= read -r var
    do
        printf "%s\n" "$var" >> foo
    done
2) awks
>>

awk:
    { print >> "foo" }

shell equivalent:

    while IFS= read -r var
    do
        printf "%s\n" "$var" >> foo
    done

哎呀!假设
的工作方式相同,谢谢您让我知道。你能给我指一下我能了解到它们差异的任何参考资料吗。
“manawk了解这些运算符在awk中的工作方式”
注意三元运算符仅为
gnuawk
,+1。自20世纪80年代末以来,三元运算符一直是awk语言的一部分。它不仅仅是呆板的,所有现代awk都应该支持它。@Aryan I发布了2个awk操作及其“shell等价物”的示例。是的
awk“BEGIN{print(1==1?1:0)}”
在Mac上工作,后者不工作。很高兴知道!不错的一个@EdMorton
awk:
    { print > "foo" }

shell equivalent:

    > foo
    while IFS= read -r var
    do
        printf "%s\n" "$var" >> foo
    done
awk:
    { print >> "foo" }

shell equivalent:

    while IFS= read -r var
    do
        printf "%s\n" "$var" >> foo
    done