1

我对 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
4

1 回答 1

2

问题是您使用了错误的输出重定向运算符。你应该使用>not >>。awk 的行为与 shell wrt 这两个运算符不同。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 与 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
于 2013-08-11T15:47:57.393 回答