awk:使用将一列文件转换为多列csv文件
awk: convert one column file in a multiple columns csv file using
我有一个看起来像这样的文件
a
b
c
g
v
b
g
h
t
y
我正在寻找一个 awk 解决方案来将上述文件转换成这样
a,b,c,g
v,b,g,h
t,y
如果我咨询 here 我想我可以先使用 awk 进行转置,然后将我的唯一行分成多行。但是,我想我无法真正理解如何。
有什么好的 tutorials/link/cookbook/suggestion 可以咨询一下吗?
你可以使用这个awk
:
awk 'NR%4 {printf [=10=]",";next} 1; END {print ""}' file
当行号不能被四整除时,只打印没有换行符的行并添加一个逗号。否则,打印带有换行符的行。
您可以使用 END
块在末尾打印换行符。
这是一个可能的解决方案
% cat p
echo 'a
b
c
g
v
b
g
h
t
y' | awk '{x=x==""?[=10=]:x "," [=10=]} 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
我们必须打印最后一行,如果它之前没有打印的话。
使用 sed:
sed '$!N;$!N;$!N;s/\n/,/g' file
其工作方式是 $! N
如果尚未到达文件末尾则执行 N
,N
获取下一行并将其附加到模式 space。重复三次,使模式 space 中有四行(或更少,在文件末尾),然后 s/\n/,/g
用逗号替换它们之间的换行符。
简短而甜美:
paste -d, - - - - | sed 's/,*$//'
将您的文件输入其中。
我有一个看起来像这样的文件
a
b
c
g
v
b
g
h
t
y
我正在寻找一个 awk 解决方案来将上述文件转换成这样
a,b,c,g
v,b,g,h
t,y
如果我咨询 here 我想我可以先使用 awk 进行转置,然后将我的唯一行分成多行。但是,我想我无法真正理解如何。 有什么好的 tutorials/link/cookbook/suggestion 可以咨询一下吗?
你可以使用这个awk
:
awk 'NR%4 {printf [=10=]",";next} 1; END {print ""}' file
当行号不能被四整除时,只打印没有换行符的行并添加一个逗号。否则,打印带有换行符的行。
您可以使用 END
块在末尾打印换行符。
这是一个可能的解决方案
% cat p
echo 'a
b
c
g
v
b
g
h
t
y' | awk '{x=x==""?[=10=]:x "," [=10=]} 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
我们必须打印最后一行,如果它之前没有打印的话。
使用 sed:
sed '$!N;$!N;$!N;s/\n/,/g' file
其工作方式是 $! N
如果尚未到达文件末尾则执行 N
,N
获取下一行并将其附加到模式 space。重复三次,使模式 space 中有四行(或更少,在文件末尾),然后 s/\n/,/g
用逗号替换它们之间的换行符。
简短而甜美:
paste -d, - - - - | sed 's/,*$//'
将您的文件输入其中。