如何在AWK中以CSV格式打印一系列列?

时间:2014-08-23 12:13:15

标签: bash awk

使用awk,我可以打印CSV中的任何列,例如,这将打印file.csv中的第10列。

awk -F, '{ print $10 }' file.csv

如果我需要打印5-10列,包括逗号,我只知道这种方式:

awk -F, '{ print $5","$6","$7","$8","$9","$10 }' file.csv

如果我想要打印很多列,这种方法就不太好了。是否有更简单的语法在awk

中打印CSV中的一系列列

3 个答案:

答案 0 :(得分:9)

在awk中执行此操作的标准方法是使用for循环:

awk -v s=5 -v e=10 'BEGIN{FS=OFS=","}{for (i=s; i<=e; ++i) printf "%s%s", $i, (i<e?OFS:ORS)}' file

但是,如果您的分隔符很简单(如您的示例所示),您可能更愿意使用cut

cut -d, -f5-10 file

Perl值得一提(使用-a启用autosplit模式):

perl -F, -lane '$"=","; print "@F[4..9]"' file

答案 1 :(得分:4)

您可以在awk中使用循环来打印5到10的列:

awk -F, '{ for (i=5; i<=10; i++) print $i }' file.csv

请注意,使用print它会在新行上打印每列。如果您想使用OFS在同一行打印它们,请使用:

awk -F, -v OFS=, '{ for (i=5; i<=10; i++) printf("%s%s", $i, OFS) }' file.csv

答案 2 :(得分:2)

使用GNU awk for gensub():

$ cat file
a,b,c,d,e,f,g,h,i,j,k,l,m
$
$ awk -v s=5 -v n=6 '{ print gensub("(([^,]+,){"s-1"})(([^,]+,){"n-1"}[^,]+).*","\\3","") }' file
e,f,g,h,i,j

s是起始位置,n是从该点开始打印的字段数。或者如果您更喜欢指定开始和结束:

$ awk -v s=5 -v e=10 '{ print gensub("(([^,]+,){"s-1"})(([^,]+,){"e-s"}[^,]+).*","\\3","") }' file
e,f,g,h,i,j

请注意,这只适用于单字符字段分隔符,因为它依赖于能够否定字符类中的FS。