使用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中的列范围?
发布于 2014-08-23 12:35:38
在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
发布于 2014-08-23 12:14:20
您可以在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
发布于 2014-08-23 13:25:33
使用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。
https://stackoverflow.com/questions/25461806
复制相似问题