使用bash

时间:2017-01-12 06:19:09

标签: bash csv awk sed

我有一个40左右的csv目录。每个csv文件顶部都有额外的10行,我不需要。我是bash命令的新手,但我发现我可以使用

tail -n +10 oldfile.csv > newfile.csv

一次从文件中剪切10行。如何在目录中的所有csv中执行此操作?我试过这样做:

for filename in *foo*; do echo tail -n +10 \"$filename\" > \"${filename}\"; done

根据我的阅读,我认为这会在其名称中传递包含 foo 的每个csv,运行公式,并保留文件名。我哪里错了?

3 个答案:

答案 0 :(得分:2)

您不能使用与输入和输出相同的文件。

使用sed,您可以使用-i标记编辑到位文件:

for f in *.csv; do
    sed -i '1,10d' "$f"
done

或作为命令行的一行代码:

for f in *.csv; do sed -i '1,10d' "$f"; done

作为旁注,您的tail应为tail -n +11,以便将第11行输出到文件末尾。

答案 1 :(得分:1)

使用如下所示的正确循环。我使用ex内部使用的本地Vim编辑器进行就地替换,因此您不必使用mv或任何其他命令再次移回文件。

for file in *.csv
do
    ex -sc '1d10|x' "$file"
done

命令移动到第一行,从第一行中选择10行,删除它并保存&关闭文件。

在一行中使用命令行友好版本

for file in *.csv; do ex -sc '1d10|x' "$file"; done

ex命令为POSIX compatible,可以在所有主要平台和发行版上运行。

答案 2 :(得分:0)

在awk中:

$ awk 'FNR>10{ print > "new-" FILENAME }' files*

说明:

  • FNR>10如果当前文件中的当前记录号大于10,则条件为真。
  • print好,输出
  • > "new-" FILENAME将输出重定向到名为new-file的新文件,例如。

已编辑以将输出写入多个文件。刚刚输出到屏幕的原件是awk 'FNR>10' files*