【问题标题】:How to add a column at the end of multiple csv files using shell script如何使用 shell 脚本在多个 csv 文件的末尾添加一列
【发布时间】:2017-11-10 18:34:43
【问题描述】:

我有几千个 CSV 文件。它们都具有相同的结构和标题。我想在文件末尾添加一列。我找到了几个向该列添加列和值的解决方案,但我没有找到为该新列添加标题的任何内容。例如,我有 1001.csv、1002.csv、1003.csv 等文件。

Contents of 1001.csv

ID,URL
1,one.com
2,two.com

我想这样修改

ID,URL,FILE
1,one.com,1001
2,two.com,1001

由于我有大量这样的文件,我不想在添加列时弄乱数据。另外,如果可以进行就地更新,我不想产生额外的文件。

【问题讨论】:

    标签: linux shell csv


    【解决方案1】:

    我对大量文件进行了测试,它运行得非常快。此代码首先删除标题,然后向该列添加一列加值,最后将标题带回。

    #!/bin/bash
    
    # How to run $ ./this-script.sh inputdir/
    # here inputdir contains all csv files
    
    # input argument is dir name
    DIRNAME=`basename $1`
    # go to target directory
    cd $DIRNAME
    
    # get list of all csv files
    csvfiles=`ls *.csv`
    
    for FILENAME in $csvfiles
    do
        echo $FILENAME
        # filename without extension
        CODE="${FILENAME%.*}"
        echo $CODE
    
        ## remove header
        tail -n +2 "$FILENAME" > "$FILENAME.tmp" && mv "$FILENAME.tmp" "$FILENAME"
    
        ## add new field at the end
        sed "s/$/,$CODE/" "$FILENAME" > "$FILENAME.tmp2"
    
        ## add header with new column name
        # keep filename.bak as a backup for safety
        sed -i.bak 1i"id,url,file" "$FILENAME.tmp2"
    
        # if all good then remove temp files
        rm "$FILENAME"
        rm "$FILENAME.tmp2.bak"
    
        # rename output file to original name
        mv "$FILENAME.tmp2" "$FILENAME"     
    done
    # go back to parent directory
    cd ..
    

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 2016-09-10
      • 2012-03-19
      • 2018-07-02
      • 2013-10-16
      • 2014-08-22
      • 2019-06-21
      • 1970-01-01
      相关资源
      最近更新 更多