我有一堆使用标题的 *.csv 文件。现在这些文件有标题和相同数量的数据行。我需要删除这些文件中的数据,所以我想我可以将标题覆盖到文件中。我已经A
正确设置了文件标题。我如何cat
A
覆盖所有其他 csv 文件?
或者,我如何从文件中删除最后 X 行?文件的路径是*/*.csv
答案1
将标题放入每个文件中。我假设这
A
是一个文件,因为你提到了cat
。如果是这样,你可以直接复制:for file in */*.csv; do cp A "$file"; done
如果
A
是变量,则执行for file in */*.csv; do echo "A" > "$file"; done
或者,如果您只需要第一行,您可以将其放入每个文件中。这样,它也适用于不同的标题:
for file in */*.csv; do head -n "$file" > /tmp/foo && mv /tmp/foo "$file"; done
有许多删除文件最后 X 行的方法有以下三种:
head
,将 X 更改为您想保留的行数:for file in */*.csv; do head -n X $file > /tmp/foo && mv /tmp/foo "$file"; done
awk
,将其中的几行更改123
为您想要保留的行数:for file in */*.csv; do awk 'NR<=123' "$file" > /tmp/foo && mv /tmp/foo "$file"; done
perl
,将其中的几行更改123
为您想要保留的行数:for file in */*.csv; do perl -ne "next if $.>123;print' "$file" > /tmp/foo && mv /tmp/foo "$file"; done
答案2
您可以使用 sed 和一些管道创造力将文件列表(或任何内容)转换为命令列表。
这是一个测试,它只会输出命令让您看看会发生什么:
$ ls *.cvs | sed "s/.*/cat headerfile.cvs > &/"
如果你喜欢它,请执行相同操作并将其传输到你最喜欢的 shell 中:
$ ls *.cvs | sed "s/.*/cat headerfile.cvs > &/" | bash
或者对于递归解决方案,您可以使用 find:
find . -name \*.cvs | sed "s/.*/cat headerfile.cvs > &/" | bash