使用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
?
答案 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。