我有一个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,运行公式,并保留文件名。我哪里错了?
答案 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*