我是一个命令行新手,我试图找出如何为多个.csv文件添加标题。新标题应包含以下内容:' TaxID'和'文件名'
我尝试了多个命令,如sed,ed,awk,echo但是如果它有效,它只更改了它找到的第一个文件(我在命令中说* .csv),我只能为TaxID管理这个。
任何人都可以帮助我将文件名放入标题中并为我的所有csv文件执行此操作吗?
(注意,我使用的是Mac)
谢谢!
答案 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