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

标签 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

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

最佳答案

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

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

关于linux - 如何使用 shell 脚本在多个 csv 文件的末尾添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47219681/

相关文章:

linux - 如何在 Bash 中编写将在 CTRL+C 上中断的循环?

shell - shell中如何乘以小数点

windows - 如何安装 Git shell

linux - sed 无法使用 bash 脚本注释文件中的一行

c# - 将嵌套的 JSON 转换为 CSV

c - 如何在 C linux 套接字中包含 IP 数据包?

linux - 如何使用 linux cli 忽略 csv 文件中的任何特定列数据?

mysql - 使用 'mysqldump' 以 CSV 格式转储所有表格

c# - 二维字典或查找表?

linux - eclipse indigo - windowbuilder - eclipse 不会重新获得焦点