Ashley
Ashley

Reputation: 27

Adding a column in multiple csv file using awk

I want to add a column at the multiple (500) CSV files (same dimensionality). Each column should act as an identifier for the individual file. I want to create a bash script using awk(I am a new bee in awk). The CSV files do come with headers.

For eg. Input File1.csv

 #name,#age,#height
 A,12,4.5
 B,13,5.0

Input File2.csv

 #name,#age,#height
 C,11,4.6
 D,12,4.3

I want to add a new column "#ID" in both the files, where the value of ID will be same for an individual file but not for both the file.

Expected Output File1.csv

 #name,#age,#height,#ID
 A,12,4.5,1
 B,13,5.0,1

Expected File2.csv

 #name,#age,#height,#ID
 C,11,4.6,2
 D,12,4.3,2

Please suggest.

Upvotes: 0

Views: 544

Answers (3)

Ed Morton
Ed Morton

Reputation: 203324

With GNU awk for inplace editing and ARGIND:

awk -i inplace -v OFS=, '{print $0, (FNR==1 ? "#ID" : ARGIND)}' File*.csv

Upvotes: 0

Michael Back
Michael Back

Reputation: 1871

awk -F, -v OFS=, ‘
    FNR == 1 {
        $(NF + 1) = “ID#”
        i++
        f = FILENAME
        sub(/Input/, “Output”, f)
    } FNR != 1 {
        $(NF + 1) = i
    } {
        print > f
    }’ Input*.csv

Upvotes: 0

karakfa
karakfa

Reputation: 67467

If you don't need to extract the id number from the filename, this should do.

$ c=1; for f in File*.csv; 
  do 
     sed -i '1s/$/,#ID/; 2,$s/$/,'$c'/' "$f"; 
     c=$((c+1)); 
  done

note that this is inplace edit. Perhaps make a backup or test first.

UPDATE If you don't need the individual files to be updated, this may work better for you

$ awk -v OFS=, 'BEGIN  {f="allFiles.csv"} 
                FNR==1 {c++; print $0,"#ID" > f; next} 
                       {print $0,c > f}' File*.csv

Upvotes: 1

Related Questions