使用 xargs 和 sed 将一个文件的第一行复制到其他文件

使用 xargs 和 sed 将一个文件的第一行复制到其他文件

我有一个拆分 CSV 文件的列表。如何将第一个 CSV 标头复制到其余 CSV 文件?

profiles00.csv profiles01.csv profiles02.csv profiles03.csv ...

这就是我现在所拥有的,但是如何将输出发送到新文件或替换现有文件?

find . -name \*.csv -print0 | xargs -0 -I {} -P 100 sed -e '1r {}' -e 'q' profiles00.csv

答案1

这是处理您的特定问题的一种方法:

find . -maxdepth 1 -type f -name "profiles*.csv" ! -name "profiles00.csv" -exec sed -i -e '1!b' -e 'R profiles00.csv' -e 'N' {} +

以多行方式编写为:

find . -maxdepth 1 \
    -type f \
    -name "profiles*.csv" ! -name "profiles00.csv" \
    -exec sed -i -e '1!b' \
                 -e 'R profiles00.csv' \
                 -e 'N' \
     {} +

读作:寻找公用事业应

  • -maxdepth 1=> 仅在当前目录中行走,通常它会一直递归到最低层次结构。

  • -type f=> 步行时仅选择常规文件。

  • -name "profiles*.csv" ! -name "profiles00.csv"=> 在所有常规文件中,仅选择以profiles*.csv 作为基本名称的文件,并过滤掉“profiles00.csv”文件,因为这是头文件。

  • -exec sed -i -e '1!b' -e 'R profiles00.csv' -e 'N' {} +

  • -i 选项 => 就地编辑文件 GNU sed 假设

  • -eoption => sed 代码如下

    • 1!b=> 不要碰非第一行。

    • R profiles00.csv=> 从profiles00.csv 文件中读取一行(因为这是第一次,所以它将是第一行)。因此,本质上,标头是从 profile00.csv 文件中提取出来的。但还没有打印出来。

    • N=> 将下一行读入模式空间。这会刷新读取缓冲区,然后从 sed 正在操作的当前文件中刷新实际模式空间(第 1,2 行)。

  • {} +将使寻找将其选择的多个文件一次性提供给sed实用程序,并且GNU sed能够使用该-i选项处理多个文件。具体来说,为读入的新文件重置行号。

≠================ Posix 方式 ======

 LC_ALL=C  \
 find . ! -name . -prune -type f  \
     -name 'profiles??*.csv'      \
   ! -name 'profiles*[!0-9]*.csv' \
   ! -name 'profiles00.csv'       \
     -exec sh -c '
              shift "$1"
              head -n 1 < profiles00.csv > header
              for arg do
                 printf "0r header\\nw\\nq\\n" | ed -s "$arg"
              done
          ' 2 1 {} +

这里我们放弃 sed 并求助于 ed。

  • 0r=> 将把提到的文件的内容插入到 ed 正在编辑的文件的开头。
  • w=> 将写入文件,从而冻结所做的所有更改。
  • q=> 将退出 ed 编辑器。

答案2

你不需要 xargs

命令 :

find . -maxdepth 1 ! -name "profiles00.csv" -a -name "*csv" -exec sed -i "1s/^/$(head -1 profiles00.csv)\n/" {} \;

在这里我用来find选择文件并sed进行就地编辑

解释

find

  • maxdepth 1- 只选择直接目录中的文件而不选择子目录中的文件,如果您也想编辑子目录中的文件,可以删除此选项
  • ! -name "profiles00.csv" -a -name "*csv"- 选择所有csv文件但不选择profiles00.csv,这里-a表示和,!表示不

sed

  • -i- 就地编辑文件
  • 1-行寻址
  • s/^/$(head -1 profiles00.csv)\n/- 用给定的文本替换文件的开头

head

  • -1- 选择第一行

答案3

这是一个未经测试的伪代码草图,因此它可能不起作用,但我会这样做(首先备份您的文件,这样您就不会覆盖它们):

sed -i '1s/^/'`head -n1 profiles00.csv`'/' *.csv

解释了

有关插入文件的更多信息:

https://stackoverflow.com/questions/9533679/how-to-insert-a-text-at-the-beginning-of-a-file

相关内容