awk无法读取大文件的内容

时间:2013-08-11 14:43:41

标签: awk gawk nawk

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

这是我的代码:FileSplitting.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 -F"," -f FileSplitting.awk test.csv

1 个答案:

答案 0 :(得分:2)

问题是您使用了错误的输出重定向运算符。您应该使用>而不是>>。 awk和shell这两个运算符的行为不一样。 man awk了解这些操作符如何在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"; }

让它工作,然后将其清理为:

BEGIN { print "Splitting file " }
{ print NR; print > ("testFile" (int($2/1024)>5?"":"2")) }
END { print "Done" }

每次写入后都不需要关闭文件。

回应下面@Aryan的评论,这里是>>> awk vs shell等价物:

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