使用awk将单列转换为三个逗号分隔列

时间:2015-08-09 22:21:33

标签: awk

我有一个长列,想要使用awk或任何Unix工具将其重新格式化为三个逗号分隔列,如下所示。

输入:

Xaa
Ybb
Mdd
Tmmn
UUnx
THM
THSS
THEY
DDe

输出:

Xaa,Ybb,Mdd
Tmmn,UUnx,THM
THSS,THEY,DDe

3 个答案:

答案 0 :(得分:7)

$ awk '{printf "%s%s",$0,NR%3?",":"\n";}' file
Xaa,Ybb,Mdd
Tmmn,UUnx,THM
THSS,THEY,DDe

如何运作

对于每一行输入,这将打印后跟的行,具体取决于行号,逗号或换行符。

关键部分是这个三元声明:

NR%3?",":"\n"

这将采用模数为3的行号。如果该值为非零,则返回逗号。如果为零,则返回换行符。

处理在最后一行完成之前结束的文件

假设文件中的行数是三的整数倍。如果它不是,那么我们可能想要确保最后一行有换行符。正如Jonathan Leffler建议的那样,这可以使用:

awk '{printf "%s%s",$0,NR%3?",":"\n";} END { if (NR%3 != 0) print ""}' file

如果最后一行缺少三列,则上面的代码将在该行上留下一个逗号。这可能是也可能不是问题。如果我们不想要最终的逗号,请使用:

awk 'NR==1{printf "%s",$0; next} {printf "%s%s",(NR-1)%3?",":"\n",$0;} END {print ""}' file

Jonathan Leffler提供了这种稍微简单的替代方案来实现相同的目标:

awk '{ printf("%s%s", pad, $1); pad = (NR%3 == 0) ? "\n" : "," } END { print "" }'

改进了可移植性

为了支持不使用\n作为行终止符的平台,Ed Morton建议:

awk -v OFS=, '{ printf("%s%s", pad, $1); pad = (NR%3?OFS:ORS)} END { print "" }' file

答案 1 :(得分:3)

有一个工具。使用<div ng-include src="'slider.html'"></div>

pr

3列宽,跨越,禁止标题,逗号作为分隔符。

答案 2 :(得分:0)

xargs -n3 < file | awk -v OFS="," '{$1=$1} 1'

xargs使用echo作为默认操作,$1=$1强制重建$0

只使用awk我会选择这个(这与@ jonathan-leffler和@ John1024提出的类似)

{
     sep = NR == 1 ? ""   : \
          (NR-1)%3 ? ","  : \
                     "\n"
     printf sep $0
}

END {
     printf "\n"
}