将filename列添加到目录中的所有文件

时间:2016-07-15 16:06:11

标签: csv awk sed

我在目录中有一组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;

为一个人工作。通过如何推广,我可以一次完成所有文件?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

Gee,附加到每一行的开头对于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。同时,如果你陷入困境,你可以恢复原件。