从分隔文件中删除列并将其保存到现有文件名

时间:2017-02-22 03:03:47

标签: unix awk cut

有谁知道如何从数百列中删除列并将其保存到现有文件名?而且我必须为几个文件做这件事,我可以同时一起做吗?我一直在寻找并尝试它,但似乎没有运气。 感谢那些可以提供帮助的人。

awk -F, '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=2 file > file1

这是正确的吗?

1 个答案:

答案 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适用于cutsedpaste等无法完成的事情,以及涉及的文件很小。如果性能很重要或者存在复杂的逻辑,那么总是选择更好的语言,如Perl,Python或Ruby,它们可以帮助我们编写更易读的代码。