gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:41:35 24 4
gpt4 key购买 nike

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

输入:

Xaa
Ybb
Mdd
Tmmn
UUnx
THM
THSS
THEY
DDe

输出:

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

最佳答案

$ 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

关于awk - 使用 awk 将单列转换为三个逗号分隔的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com