我对awk相当陌生,我正在编写一个脚本来读取文件的内容,然后根据结果将结果附加到几个文件中。该脚本在包含大约100行的文件上工作,但对于包含125 k行的文件则失败。我对我在这里做事情的方式是否有问题感到困惑,因为我已经看到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发布于 2013-08-11 15:47:57
问题是您使用了错误的输出重定向操作符。您应该使用>而不是>>。Awk的行为与shell wrt不同,这两个操作符。使用man了解这些操作符在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)锥>
awk:
{ print > "foo" }
shell equivalent:
> foo
while IFS= read -r var
do
printf "%s\n" "$var" >> foo
done2)锥>>
awk:
{ print >> "foo" }
shell equivalent:
while IFS= read -r var
do
printf "%s\n" "$var" >> foo
donehttps://stackoverflow.com/questions/18173118
复制相似问题