我有一个拆分 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 假设-e
option => 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