有谁知道如何从数百列中删除列并将其保存到现有文件名?而且我必须为几个文件做这件事,我可以同时一起做吗?我一直在寻找并尝试它,但似乎没有运气。 感谢那些可以提供帮助的人。
awk -F, '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=2 file > file1
这是正确的吗?
答案 0 :(得分:2)
您的awk
代码看起来不错。但是,cut
可能是你最好的朋友,如果你想加快速度:
# let's say we want to take out column number 2
for file in *; do
newfile="$file.changed"
cut -f1,3- -d, "$file" > "$newfile" && mv "$newfile" "$file"
done
这是一个awk
vs cut
比较文件,其中包含240万条完全相同的行:
1,2,3,4,5,6
time awk -F, '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=2 t >/dev/null
real 0m13.815s
user 0m13.116s
sys 0m0.217s
time cut -f1,3- -d, t >/dev/null
real 0m2.374s
user 0m2.093s
sys 0m0.054s
我使用的经验法则是awk
适用于cut
,sed
,paste
等无法完成的事情,以及涉及的文件很小。如果性能很重要或者存在复杂的逻辑,那么总是选择更好的语言,如Perl,Python或Ruby,它们可以帮助我们编写更易读的代码。