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