2016-07-15 99 views
-1

我在一个目录中有一组291 csv文件。我想要做的是将一列添加到文件的开头,其中该列的内容是文件名。所以就像:将文件名的列添加到目录中的所有文件中

filename, ID, Mag, Magerr, RA, Decl, MJD, Blend 
CSSJ235751.9+065855, 12302, 223, 34, 23.423, 23.54, 8723, 0, 

其中filename是我想要添加的新列。而且我想要这个目录中的所有文件。我正在考虑使用awksed,但我对它们不是很熟悉。

我想:

awk '{print "CSSJ235751.9+065855,"$0}' CSSJ235751.9+065855.csv > modCSSJ235751.9+065855.csv; 

这工作了一个。我将如何概括,以便我可以一次完成所有文件?

回答

0
cd /path/to/csvFiles 
for f in *.csv ; do 
    awk -v fName="${f%.csv}" '{printf("%s,%s\n", (FNR==1 ? "filename" : fName), $0)}' "$f" > mod"$f" 
done 

请务必处理您的数据副本。

IHTH

+0

我已经修改了脚本,在第一行放置了“filename”,并去掉'awk'所使用的'fName'值的'.csv'扩展名。 – shellter

0
awk ' 
BEGIN { FS=OFS=", " } 
FNR == 1 { 
    fname = FILENAME 
    out = "mod" FILENAME 
    sub(/\.csv$/,"",1,fname) 
    print "filename", $0 > out 
    next 
} 
{ print fname, $0 > out } 
' *.csv 
0

啧啧,添加到每个行的开始仅仅是简单的足够的sed。

for f in *.csv 
do 
    sed "1 s/^/filename,/; 2,$ s/^/${f%.*},/" f > f.new 
    mv f f.old && mv f.new f 
done 

根据上面的注释,扩展名为f以除去.csv扩展名。当你满意时你有你想要的,你可以删除* .old。同时,如果你搞砸了,你可以恢复原件。

相关问题