我是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
答案 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