Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在AWK中打印CSV中的一系列列?_Bash_Awk - Fatal编程技术网

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