将标头添加到文件夹中的所有.csv文件并包含文件名

时间:2015-11-18 18:10:51

标签: csv header

我是一个命令行新手,我试图找出如何为多个.csv文件添加标题。新标题应包含以下内容:' TaxID'和'文件名'

我尝试了多个命令,如sed,ed,awk,echo但是如果它有效,它只更改了它找到的第一个文件(我在命令中说* .csv),我只能为TaxID管理这个。

任何人都可以帮助我将文件名放入标题中并为我的所有csv文件执行此操作吗?

(注意,我使用的是Mac)

谢谢!

2 个答案:

答案 0 :(得分:1)

在perl中,通过添加TaxID,{filename}标头来修改文件,如果它认为已存在,则忽略添加标头。

ls
a.csv   b.csv

cat a.csv
1,a.txt
2,b.txt

cat b.csv
3,c.txt
4,d.txt

ls *.csv | xargs -I{} -n 1 \
perl -p -i -e 'print "TaxID,{}\n" if !m#^TaxID# && !$h; $h = 1;' {}

cat a.csv
TaxID,a.csv
1,a.txt
2,b.txt

cat b.csv
TaxID,b.csv
3,c.txt
4,d.txt

您可能需要创建一些文件备份,或者在运行之前运行一些示例副本。

<强>解释性:

列出目录中.csv extenstion

的所有文件
ls *.csv

&#34;管&#34;将ls命令输出到xargs中,以便perl命令可以为每个文件运行。 -I{}允许随后使用{}引用文件名。 -n告诉xargs一次只传递1个文件到perl。

| xargs -I{} -n 1

-p打印输入(文件)的每一行

-i修改文件

-e执行以下代码

perl -p -i -e

Perl将隐式循环遍历文件的每一行并打印它(由于-p)。如果我们尚未打印标题并且当前行看起来不像标题,则打印标题。

'print "TaxID,{}\n" if !m#^TaxID# && !$h; $h = 1;'

将其替换为文件名。

{}

总而言之,在这个例子中,要运行的命令是:

perl -p -i -e 'print "TaxID,{}\n" if !m#^TaxID# && !$h; $h = 1;' a.csv
perl -p -i -e 'print "TaxID,{}\n" if !m#^TaxID# && !$h; $h = 1;' b.csv
perl -p -i -e 'print "TaxID,{}\n" if !m#^TaxID# && !$h; $h = 1;' c.csv
perl -p -i -e 'print "TaxID,{}\n" if !m#^TaxID# && !$h; $h = 1;' d.csv

答案 1 :(得分:1)

这是一种方法,其中有一些:

$ cat file1.csv
1,2
3,4
$ cat file2.csv
a,b
c,d
$ for i in *.csv;do echo $i;cp "$i" "$i.bak" && { echo "TaxID,$i"; cat "$i.bak"; } >"$i";done
file1.csv
file2.csv
$ cat file1.csv.bak
1,2
3,4
$ cat file1.csv
TaxID,file1.csv
1,2
3,4
$ cat file2.csv.bak
a,b
c,d
$ cat file2.csv
TaxID,file2.csv
a,b
c,d

这是一个示例运行:

$ for i in *.csv; do

打破它:

.csv

这将遍历当前目录中以i结尾的所有文件。每个都将依次放入shell变量echo $i;

cp "$i" "$i.bak"

这只是回显当前文件名,以便您可以看到进度。这可以安全地遗漏。

i

将当前文件(名称在&& )复制到备份。如果出现问题,这既可以保存文件,也可以为后续命令提供复制内容。

cp

如果{ 成功,则仅运行后续命令。如果您无法进行备份,请不要继续。

echo "TaxID,$i";

启动组命令。

cat "$i.bak";

输出所需的标题。

}

输出原始文件。

>"$i";

结束群组命令。

done

将group命令的输出(新标题和原始文件的内容)重定向到原始文件。这样就完成了一个文件。

ed

完成所有文件的循环。

为了好玩,以下是其他一些方法(一个JRD打败了我),包括一个使用$ for i in *.csv;do echo $i;perl -p -i.bak -e 'print "TaxID,$ARGV\n" if $. == 1' "$i";done $ for i in *.csv;do echo $i;echo -e "1i\nTaxID,$i\n.\nw\nq\n" | ed "$i";done

@ViewBag.CommentCount