2016-07-15 48 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。同時,如果你搞砸了,你可以恢復原件。

相關問題