首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CSV文件中的列替换为bash中的另一列

问将CSV文件中的列替换为bash中的另一列
EN

Stack Overflow用户
提问于 2013-06-29 00:15:03
回答 3查看 5K关注 0票数 3

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

代码语言:javascript
复制
1,2,3,4,5,6
a,b,c,d,e,f
g,h,i,j,k,l

我想输出:

代码语言:javascript
复制
1,5,3,4,5,6
a,e,c,d,e,f
g,k,i,j,k,l

有人能帮我完成这项任务吗?还要注意,之后我将使用cut函数丢弃最后两列,这样我就可以开始分离csv文件,这样我就可以用另一个csv文件中的另一列替换另一个csv文件中的列。以更容易实现的方式实现。提前感谢您的帮助。

EN

回答 3

Stack Overflow用户

发布于 2013-06-29 00:24:30

这个更简单的awk怎么样:

代码语言:javascript
复制
awk 'BEGIN{FS=OFS=","} {$2=$(NF-1)}'1 sample.csv

编辑:注意到您还想丢弃最后两列。使用下面的awk一行代码:

代码语言:javascript
复制
awk 'BEGIN{FS=OFS=","} {$2=$(NF-1); NF=NF-2}'1 sample.csv
票数 10
EN

Stack Overflow用户

发布于 2013-06-29 00:23:44

在狂欢中

代码语言:javascript
复制
while IFS=, read -r -a arr; do
  arr[1]="${arr[4]}";  
  printf -v output "%s," "${arr[@]}"; 
  printf "%s\n" "${output%,}"; 
done < sample.csv
票数 0
EN

Stack Overflow用户

发布于 2013-06-29 00:32:57

纯bash解决方案,以一种有趣的方式使用IFS:

代码语言:javascript
复制
# 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语句中,以便根据coma拆分每个字段;另一次是在echo "${a[*]}"行中,其中"${a[*]}"将扩展到由IFS分隔的数组a的字段...这就是昏迷!

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

注意事项。csv文件需要一个很难实现的特殊csv解析器。如果字段包含coma,则该答案(以及我猜测不使用真正的csv解析器的所有其他答案)可能会中断,例如,

代码语言:javascript
复制
    1,2,3,4,"a field, with a coma",5

如果您想丢弃最后两列,请不要使用cut,而应使用以下命令:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17369202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档