将模板头复制到多个现有文件

将模板头复制到多个现有文件

我有一堆使用标题的 *.csv 文件。现在这些文件有标题和相同数量的数据行。我需要删除这些文件中的数据,所以我想我可以将标题覆盖到文件中。我已经A正确设置了文件标题。我如何cat A覆盖所有其他 csv 文件?

或者,我如何从文件中删除最后 X 行?文件的路径是*/*.csv

答案1

  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
    
  2. 许多删除文件最后 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

相关内容