【问题标题】:Replacing a column in CSV file with another in bash用 bash 中的另一列替换 CSV 文件中的列
【发布时间】:2013-06-26 11:48:58
【问题描述】:

我有一个包含许多列的 csv 文件。我正在尝试用同一文件中的倒数第二列替换第二列。 例如,如果我有一个文件,sample.csv

1,2,3,4,5,6
a,b,c,d,e,f
g,h,i,j,k,l

我要输出:

1,5,3,4,5,6
a,e,c,d,e,f
g,k,i,j,k,l

谁能帮我完成这个任务?另请注意,之后我将使用 cut 函数丢弃最后两列,因此我愿意将 csv 文件分开,以便我可以将一个 csv 文件中的列替换为另一个 csv 文件中的另一列。哪个更容易实现。提前感谢您的帮助。

【问题讨论】:

    标签: bash csv awk


    【解决方案1】:

    这个更简单的 awk 怎么样:

    awk 'BEGIN{FS=OFS=","} {$2=$(NF-1)}'1 sample.csv
    

    编辑:注意到您还想丢弃最后两列。使用这个 awk 单行代码:

    awk 'BEGIN{FS=OFS=","} {$2=$(NF-1); NF=NF-2}'1 sample.csv
    

    【讨论】:

    • @JS웃 来自你,这是一个很大的赞美:)
    • 嗨,当我使用这个命令时,当我用 excel 查看文件时,它会执行我想要的操作,但是当我在记事本上打开文件时,一行中的最后一个字段有与下一行的第一个字段没有分隔。例如,如果第一行的最后一个字段是“apple”,第二行的第一个字段是“banana”,那么在命令之后,我会得到“applebanana”,我想知道如何解决这个问题。谢谢
    • 在记事本中打开与修改 CSV 文件是不同的问题。记事本需要\r\n在每一行的末尾。
    【解决方案2】:

    在 bash 中

    while IFS=, read -r -a arr; do
      arr[1]="${arr[4]}";  
      printf -v output "%s," "${arr[@]}"; 
      printf "%s\n" "${output%,}"; 
    done < sample.csv
    

    【讨论】:

      【解决方案3】:

      解决方案,以有趣的方式使用IFS

      # Set globally the IFS, you'll see it's funny
      IFS=,
      while read -ra a; do
          a[1]=${a[@]: -2:1}
          echo "${a[*]}"
      done < file.csv
      

      全局设置IFS 变量使用两次:一次在read 语句中,以便每个字段根据逗号分割,在echo "${a[*]}" 行中"${a[*]}" 将扩展到数组的字段aIFS 分隔...这是一个昏迷!

      另一件特别的事情:您提到了倒数第二个字段,这正是${a[@]: -2:1} 将扩展到的内容(注意:-2 之间的空格),这样您就不必'不必计算你的字段数。

      警告。 csv 文件需要一个难以实现的特殊 csv 解析器。如果字段包含逗号,则此答案(我猜所有其他不使用真正的 csv 解析器的答案)可能会中断,例如,

          1,2,3,4,"a field, with a coma",5
      

      如果您想丢弃最后两列,请不要使用cut,而是使用以下代码:

      IFS=,
      while read -ra a; do
          ((${#a[@]}<2)) || continue # skip if array has less than two fields
          a[1]=${a[@]: -2:1}
          echo "${a[*]::${#a[@]}-2}"
      done < file.csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2020-05-12
        相关资源
        最近更新 更多