我需要通过将名称切换为以下方式在多个 .csv 文件中同时包含 .csv 标头:
原始名称1c.csv、原始名称2c.csv、原始名称3c.csv
目前,流程如下:
cat header.csv originalname1.csv > originalname1c.csv
cat header.csv originalname2.csv > originalname2c.csv
cat header.csv originalname3.csv > originalname3c.csv
ETC。
是否可以像上面的示例一样在单个命令中向多个文件添加标头?
附加一:如果文件名是随机的怎么办?保持规则从:anyname.csv 到 anynamec.csv
答案1
for name in anyname*.csv; do
cat header.csv "$name" >"${name%.csv}c.csv"
done
这里anyname*.csv
是一些 shell 模式,可能包括与您想要在其中添加 .csv 文件内容的 CSV 文件名称相匹配的目录路径header.csv
。理想情况下,此模式不应与名称匹配header.csv
。如果是,请考虑将其移至其他位置、重命名或插入显式测试以跳过它:
for name in anyname*.csv; do
[ "${name##*/}" = header.csv ] && continue
cat header.csv "$name" >"${name%.csv}c.csv"
done
或者,在bash
orzsh
外壳中,
for name in anyname*.csv; do
[ "$name" -ef header.csv ] && continue
cat header.csv "$name" >"${name%.csv}c.csv"
done
(或者不理会它并删除headerc.csv
可能生成的文件。)
该循环迭代匹配的名称,并通过将标头与 CSV 记录连接来创建新文件,创建一个名称与原始文件相同但文件.csv
名后缀替换为c.csv
.
标准扩展${var%pattern}
扩展为$var
,但删除了最短后缀字符串匹配pattern
。扩展${var##pattern}
也是标准的,并从 中删除最长的匹配前缀字符串$var
。上面的一个示例使用它来删除$name
.
答案2
for i in 1 2 3; do cat header.csv originalname${i}.csv > originalname${i}c.csv; done
或者
for i in name1 mynameH arglebargle; do cat header.csv ${i}.csv > ${i}c.csv; done
此外,对于一堆编号的文件:
for i in $(seq 1000); do cat header.csv file${i} > file${i}c.csv; done
$(seq 1000)
也可以是{1..1000}
这让你
cat header.csv file1 > file1c.csv
cat header.csv file2 > file2c.csv
cat header.csv file3 > file3c.csv
.
.
.
cat header.csv file998 > file998c.csv
cat header.csv file999 > file999c.csv
cat header.csv file1000 > file1000c.csv
执行此操作的一般方法是使用以下行:
for i in *.csv; do if [ "$i" != header.csv ]; then cat header.csv "$i" > $(basename "$i" .csv)c.csv; fi; done
命令“basename”会分解给定的路径,并仅返回文件名,如果您指定了后缀(就像我们在此处使用的 .csv 一样),也会删除该部分。然后我们添加“c”,放回 .csv,这就是新的文件名。
“if”条件会跳过头文件,否则它也会被卡住。