awk之linux csv文件将列连接成一列

pengyingh 阅读:11 2024-07-26 13:47:55 评论:0

我一直在寻找用 sed、awk 或 cut 来做到这一点。我愿意使用可以通过管道传输数据的任何其他命令行程序。

我有大量以逗号分隔的数据。行有 14 到 20 列。我需要递归地将第 10 列与每行第 11 列连接起来,这样每一行正好有 14 列。换句话说,这:

a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p 

会变成:
a,b,c,d,e,f,g,h,i,jkl,m,n,o,p 

我可以得到前 10 列。我可以得到最后 N 列。我可以连接列。我想不出如何在一行中完成它,这样我就可以通过它传递无穷无尽的数据流,最终每行正好有 14 列。

示例(按要求):

一行中有多少列?
sed 's/[^,]//g' | wc -c 

获取前 10 列:
cut -d, -f1-10 

获取最后 4 列:
rev | cut -d, -f1-4 | rev 

连接第 10 列和第 11 列,之后显示第 1-10 列:
awk -F',' ' NF { print $1","$2","$3","$4","$5","$6","$7","$8","$9","$10$11}' 

请您参考如下方法:

Awk 解决方案:

awk 'BEGIN{ FS=OFS="," } 
     {  
         diff = NF - 14; 
         for (i=1; i <= NF; i++) 
             printf "%s%s", $i, (diff > 1 && i >= 10 && i < (10+diff)? 
                                 "": (i == NF? ORS : ","))  
     }' file 

输出:
a,b,c,d,e,f,g,h,i,jkl,m,n,o,p 


标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号