使用awk在多个csv文件中添加列

时间:2018-06-14 18:26:58

标签: csv awk

我想在多个(500个)CSV文件(相同维度)中添加一列。每列应充当单个文件的标识符。我想用awk创建一个bash脚本(我是awk中的新蜜蜂)。 CSV文件带有标题。

例如。 输入File1.csv

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

输入File2.csv

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

我想添加一个新列"#ID"在两个文件中,ID的值对于单个文件是相同的,但对于文件都不相同。

预期产出 File1.csv

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

预期File2.csv

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

请建议。

3 个答案:

答案 0 :(得分:1)

如果您不需要从文件名中提取ID号,则应该这样做。

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

请注意,这是就地编辑。也许先做备份或测试。

<强>更新 如果您不需要更新单个文件,这可能会更适合您

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用GNU awk进行就地编辑和ARGIND:

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