我有一个包含多个列的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文件中的列。以更容易实现的方式实现。提前感谢您的帮助。
发布于 2013-06-29 00:24:30
这个更简单的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发布于 2013-06-29 00:23:44
在狂欢中
while IFS=, read -r -a arr; do
arr[1]="${arr[4]}";
printf -v output "%s," "${arr[@]}";
printf "%s\n" "${output%,}";
done < sample.csv发布于 2013-06-29 00:32:57
纯bash解决方案,以一种有趣的方式使用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语句中,以便根据coma拆分每个字段;另一次是在echo "${a[*]}"行中,其中"${a[*]}"将扩展到由IFS分隔的数组a的字段...这就是昏迷!
另一件特别的事:您提到了倒数第二个字段,这正是${a[@]: -2:1}将扩展到的(注意:和-2之间的空格),这样您就不必计算字段的数量。
注意事项。csv文件需要一个很难实现的特殊csv解析器。如果字段包含coma,则该答案(以及我猜测不使用真正的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.csvhttps://stackoverflow.com/questions/17369202
复制相似问题