Bash 如何在AWK中打印CSV中的一系列列?
使用Bash 如何在AWK中打印CSV中的一系列列?,bash,awk,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中的一系列列是否有更简单的语法?您可以使用awk中的循环打印5到10列: awk -F, '{ for (i=5;
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中的一系列列是否有更简单的语法?您可以使用awk中的循环打印5到10列:
awk -F, '{ for (i=5; i<=10; i++) print $i }' file.csv
在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
Perl值得一提(使用-a
启用自动拆分模式):
对于gensub(),使用GNU awk:
s
是起始位置,n
是从该点开始打印的字段数。或者,如果您希望指定开始和结束:
$ awk -v s=5 -v e=10 '{ print gensub("(([^,]+,){"s-1"})(([^,]+,){"e-s"}[^,]+).*","\\3","") }' file
e,f,g,h,i,j
请注意,这仅适用于单字符字段分隔符,因为它依赖于能够对字符类中的FS求反。这会在输出中添加一个尾随逗号。是的,我在回答中也提到了这一点,并且要求不清楚第10位之后的列是否会在打印后打印。+1
cut
或awk
是我真正想做的,我发布的gensub()
答案只是一个可爱的选择。
cut -d, -f5-10 file
perl -F, -lane '$"=","; print "@F[4..9]"' file
$ 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
$ awk -v s=5 -v e=10 '{ print gensub("(([^,]+,){"s-1"})(([^,]+,){"e-s"}[^,]+).*","\\3","") }' file
e,f,g,h,i,j