使用 cat linux 在多个 .csv 文件中包含标头

使用 cat linux 在多个 .csv 文件中包含标头

我需要通过将名称切换为以下方式在多个 .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

或者,在bashorzsh外壳中,

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”条件会跳过头文件,否则它也会被卡住。

相关内容