首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在AWK中打印CSV中的一系列列?

如何在AWK中打印CSV中的一系列列?
EN

Stack Overflow用户
提问于 2014-08-23 12:13:14
回答 3查看 9.1K关注 0票数 5

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

代码语言:javascript
运行
复制
awk -F, '{ print $10 }' file.csv

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

代码语言:javascript
运行
复制
awk -F, '{ print $5","$6","$7","$8","$9","$10 }' file.csv

如果我想打印许多列,这个方法就不太好了。是否有更简单的语法在awk中打印CSV中的列范围?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-23 12:35:38

在awk中这样做的标准方法是使用for循环:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
cut -d, -f5-10 file

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

代码语言:javascript
运行
复制
perl -F, -lane '$"=","; print "@F[4..9]"' file
票数 10
EN

Stack Overflow用户

发布于 2014-08-23 12:14:20

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

代码语言:javascript
运行
复制
awk -F, '{ for (i=5; i<=10; i++) print $i }' file.csv

请记住,使用print,它将在新行上打印每个列。如果要使用OFS在同一行上打印它们,请使用:

代码语言:javascript
运行
复制
awk -F, -v OFS=, '{ for (i=5; i<=10; i++) printf("%s%s", $i, OFS) }' file.csv
票数 5
EN

Stack Overflow用户

发布于 2014-08-23 13:25:33

使用GNU awk for gensub():

代码语言:javascript
运行
复制
$ 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是从该位置开始打印的字段数。或者如果您希望指定开始和结束:

代码语言:javascript
运行
复制
$ awk -v s=5 -v e=10 '{ print gensub("(([^,]+,){"s-1"})(([^,]+,){"e-s"}[^,]+).*","\\3","") }' file
e,f,g,h,i,j

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25461806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档