【发布时间】:2014-03-12 22:26:35
【问题描述】:
我有一个相当大的文件,其中包含 255 个逗号分隔的列,我只需要每隔三列打印一次。
我正在尝试这样的事情
awk '{ for (i=0;i<=NF;i+=3) print $i }' file
但这似乎不是解决方案,因为它只打印到一长列。有人可以帮忙吗?谢谢
【问题讨论】:
标签: awk
我有一个相当大的文件,其中包含 255 个逗号分隔的列,我只需要每隔三列打印一次。
我正在尝试这样的事情
awk '{ for (i=0;i<=NF;i+=3) print $i }' file
但这似乎不是解决方案,因为它只打印到一长列。有人可以帮忙吗?谢谢
【问题讨论】:
标签: awk
这是一种方法。
脚本 prog.awk:
BEGIN {FS = ","} # field separator
{for (i = 1; i <= NF; i += 3) printf ("%s%c", $i, i + 3 <= NF ? "," : "\n");}
调用:
awk -f prog.awk <input.csv >output.csv
示例 input.csv:
1,2,3,4,5,6,7,8,9,10
11,12,13,14,15,16,17,18,19,20
示例输出.csv:
1,4,7,10
11,14,17,20
【讨论】:
awk -F, '{for(i=1;i<=NF;i+=2)printf "%s%s", $i, (i+3>NF?"\n":FS)}'
i + 3 大于字段数),则打印一个换行符。否则,打印一个逗号(字段分隔符)。 NF 是字段数,FS 是字段分隔符。
它的行为是这样的,因为默认情况下awk 将字段拆分为空格。您必须告诉它用逗号分隔它们,并且使用FS 变量或-F 开关完成。除此之外,第一个字段是第一字段。零是整行,所以还要改变for循环的初始值:
awk -F',' '{ for (i=1;i<=NF;i+=3) print $i }' file
【讨论】: