批量将字符串追加到数千个CSV的第1列(Linux)

批量将字符串追加到数千个CSV的第1列(Linux),linux,bash,csv,batch-processing,Linux,Bash,Csv,Batch Processing,我将用一个例子尽我所能说明这个问题: 我在一个特定目录中有25000多个CSV文件 我需要在每个CSV的第一列中为每个条目添加“-test” CSV中没有标题,每个条目都是唯一的,每个文件名都是唯一的 因此: Column1,Column2,Column3,Column4 Unique,Entry2,Entry3,Entry4 Unique,Entry2,Entry3,Entry4 Unique,Entry2,Entry3,Entry4 将变成这样: Column1,Column2,Colum

我将用一个例子尽我所能说明这个问题:

  • 我在一个特定目录中有25000多个CSV文件
  • 我需要在每个CSV的第一列中为每个条目添加“-test”
  • CSV中没有标题,每个条目都是唯一的,每个文件名都是唯一的 因此:

    Column1,Column2,Column3,Column4
    Unique,Entry2,Entry3,Entry4
    Unique,Entry2,Entry3,Entry4
    Unique,Entry2,Entry3,Entry4
    
    将变成这样:

    Column1,Column2,Column3,Column4
    Unique-test,Entry2,Entry3,Entry4
    Unique-test,Entry2,Entry3,Entry4
    Unique-test,Entry2,Entry3,Entry4
    
    对于我的目录中所有超过25000个文件

    是否有一个bash脚本可以实现这一点


    *EDITCSV后来被发现以逗号分隔,并被“s”包围。下面介绍了这一更改。

    关于多样性,让我们看看使用
    awk
    的可能解决方案:

    find /some/path -type f -name '*.csv' -exec awk -i inplace -v FS=, -v OFS=, '$1=$1"-test"' '{}' +
    
    更新:简单的修复程序,适用于引用的列
    “Unique”、“Entry2”、“Entry3”、“Entry4”

    简单地说:
    find
    命令将在系统能够容纳的时间内生成命令行

    sed-i
    将进行填充更改,从第2行到文件末尾,用
    -test,
    替换第一个coma

    对于带有引号的CSV: 对于带有引号双引号或无引号的CSV: 这将与CSV一起使用,如:

    'Column1','Column2','Column3','Column4'
    'Unique','Entry2','Entry3','Entry4'
    'Unique','Entry2','Entry3','Entry4'
    
    "Column1","Column2","Column3","Column4"
    "Unique","Entry2","Entry3","Entry4"
    "Unique","Entry2","Entry3","Entry4"
    
    Column1,Column2,Column3,Column4
    Unique,Entry2,Entry3,Entry4
    Unique,Entry2,Entry3,Entry4
    
    并且可以呈现:

    'Column1','Column2','Column3','Column4'
    'Unique-test','Entry2','Entry3','Entry4'
    'Unique-test','Entry2','Entry3','Entry4'
    
    "Column1","Column2","Column3","Column4"
    "Unique-test","Entry2","Entry3","Entry4"
    "Unique-test","Entry2","Entry3","Entry4"
    
    Column1,Column2,Column3,Column4
    Unique-test,Entry2,Entry3,Entry4
    Unique-test,Entry2,Entry3,Entry4
    

    这可以用一行程序来完成。将鼠标悬停在批处理文件的标签上,然后阅读说明。@Squashman指出。我的错。@Iporsier我也这么想,我的问题是我几乎是一个新手,正在寻找一个快速的解决方案,因为我有点为难。不过,谢谢你的输入。@JosephLathey有没有一个标题行?谢谢。这对特定的文件名非常有效,我如何将其应用于目录中的每个文件?别担心,我是个傻瓜。file/*这比我删除的答案要好得多。+1,我为我没有想到这个
    sed
    感到羞愧……然而,我认为OP不想跳过第一行,因为他说没有实际的文件中的标题。@PesaThe OP问题用标题行表示示例。为此,我跳过了第1行。我知道你为什么跳过第1行,它出现在示例输出中。尽管从OP对我的解决方案的肯定回答和句子
    来看,CSV中没有标题,但我认为它确实不应该跳过它们。但这确实是错误的由OP决定:)如果是这样的话,你可以提一下。@PesaThe你是对的:我没有读对!这个问题是错误的!@PesaThe你的解决方案对我如何概述这个问题非常有效(基于一位同事如何解释划界)但是,现在我有了生产文件,我意识到它们被分隔为:“Unique”、“Entry2”、“Entry3”、“Entry4”,所以输出应该是:“Unique test”、“Entry2”、“Entry3”、“Entry4”,我尝试使用您的初始解决方案,然后使用:sed's/\”//g’file.csv,但没有成功:(
    
    find . -type f -name '*.csv' -exec sed -e '2,$s/",/-test",/' -i {} +
    
    find . -type f -name '*.csv' -exec sed -e '2,$s/\(["\o47]\?,\)/-test\1/' -i {} +
    
    'Column1','Column2','Column3','Column4'
    'Unique','Entry2','Entry3','Entry4'
    'Unique','Entry2','Entry3','Entry4'
    
    "Column1","Column2","Column3","Column4"
    "Unique","Entry2","Entry3","Entry4"
    "Unique","Entry2","Entry3","Entry4"
    
    Column1,Column2,Column3,Column4
    Unique,Entry2,Entry3,Entry4
    Unique,Entry2,Entry3,Entry4
    
    'Column1','Column2','Column3','Column4'
    'Unique-test','Entry2','Entry3','Entry4'
    'Unique-test','Entry2','Entry3','Entry4'
    
    "Column1","Column2","Column3","Column4"
    "Unique-test","Entry2","Entry3","Entry4"
    "Unique-test","Entry2","Entry3","Entry4"
    
    Column1,Column2,Column3,Column4
    Unique-test,Entry2,Entry3,Entry4
    Unique-test,Entry2,Entry3,Entry4