我有一个长列,想要使用awk
或任何Unix工具将其重新格式化为三个逗号分隔列,如下所示。
输入:
Xaa
Ybb
Mdd
Tmmn
UUnx
THM
THSS
THEY
DDe
输出:
Xaa,Ybb,Mdd
Tmmn,UUnx,THM
THSS,THEY,DDe
答案 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"
}