如何使用shell脚本在多个csv文件的末尾添加列

时间:2017-11-10 09:38:00

标签: linux shell csv

我有几千个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

由于我有大量这样的文件,我不想在添加列时弄乱数据。另外,如果可以在适当的位置更新,我也不想生成额外的文件。

1 个答案:

答案 0 :(得分:0)

我在大量文件上对此进行了测试,但效果非常快。此代码首先删除标题,然后向列添加列加值,最后返回标题。

#!/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 ..