使用bash从多个CSV文件裁剪行

使用bash从多个CSV文件裁剪行,bash,csv,awk,sed,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 从我所读到的内容来看,我认为这将传入每个

我有一个大约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,运行公式,而不使用文件名。我哪里出错了?

使用如下正确的循环。我使用本机
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
命令是并且可以在所有主要平台和发行版上使用。

不能将同一文件用作输入和输出

使用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行。

在awk中:

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

  • FNR>10
    如果当前文件中的当前记录数大于10,则条件为真
  • 打印
    井,输出
  • 例如,将输出重定向到名为新文件的新文件

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

运行此命令时出现“无效命令代码”错误。我运行它的方式是通过'cd'到目录,对于*.csv中的f;执行[输入],>sed-i'1,10d'$f“[输入],>done[输入]。。回到$。。然后我得到了无效的命令codeMultiline更适合脚本。我为命令行添加了一行代码。很好!但是必须在-i和'1,10d'之间添加''。。信用卡:(我在Mac电脑上)。最终版本:对于*.csv中的f;执行sed-i“1,10d”“f”;甜甜圈但它是否将其保存到文件中?