awk:使用多列csv文件转换一个列文件

时间:2015-01-09 13:15:08

标签: csv ubuntu awk

我有一个看起来像那样的文件

a
b
c
g
v
b
g
h
t
y

我正在寻找一个awk解决方案来转换上面这样的文件

a,b,c,g
v,b,g,h
t,y

如果我咨询here我想我可以先使用awk进行转置,然后将我的唯一一行划分为多行。但是,我想我真的不明白怎么做。 有什么好的教程/链接/食谱/建议可以参考吗?

4 个答案:

答案 0 :(得分:3)

您可以使用此awk

awk 'NR%4 {printf $0",";next} 1; END {print ""}' file

当行号不能被四个分割时,只需打印不带换行符的行并添加逗号。否则,使用换行符打印该行。

您可以使用END块在最后打印换行符。

答案 1 :(得分:1)

这是一个可能的解决方案

% cat p
echo 'a
b
c
g
v
b
g
h
t
y' | awk '{x=x==""?$0:x "," $0} NR%4==0{print x;x=""} END {if(x!="") print x}'
% sh p
a,b,c,g
v,b,g,h
t,y
% 

构建一行输出,用逗号连接多个输入行,当元素数等于4时,我们打印并重置输出行。

END我们必须打印最后一行,如果它不是之前打印的那么。

答案 2 :(得分:0)

使用sed:

sed '$!N;$!N;$!N;s/\n/,/g' file

这种方法的工作方式是$! N如果尚未到达文件末尾则执行NN获取下一行并将其附加到模式空间。这样做了三次,以便四个(或更少,在文件的末尾)行在模式空间中,然后s/\n/,/g用逗号替换它们之间的换行符。

答案 3 :(得分:0)

短而甜蜜:

paste -d, - - - - | sed 's/,*$//'

将文件传输到该文件中。