Parsing awk从输入列表中选择列

Parsing awk从输入列表中选择列,parsing,csv,awk,Parsing,Csv,Awk,我想要一个awk脚本,根据另一个文件中的列列表从文件中选择列。例如: $cat cols 3 2 6 4 $cat text a b c d e f g h i j k l m n $awk_script cols text c b f d j i m k 因此,第三、第二、第六和第四列已按顺序选择 谢谢您可以使用: awk 'NR==FNR{n=split($0,c);next}{for(i=1;i<n;i++){printf "%s%s", $c[i], OFS};print "

我想要一个awk脚本,根据另一个文件中的列列表从文件中选择列。例如:

$cat cols
3 2 6 4

$cat text
a b c d e f g
h i j k l m n

$awk_script cols text
c b f d
j i m k
因此,第三、第二、第六和第四列已按顺序选择

谢谢

您可以使用:

awk 'NR==FNR{n=split($0,c);next}{for(i=1;i<n;i++){printf "%s%s", $c[i], OFS};print ""}' cols text
您可以使用以下选项:

awk 'NR==FNR{n=split($0,c);next}{for(i=1;i<n;i++){printf "%s%s", $c[i], OFS};print ""}' cols text

永远不要对格式字段printf$c[i]中的输入数据执行printf,而是使用完整的printf大纲printf%s,$c[i]。想象一下,如果$c[i]包含一个printf格式字符串,例如%s,会有什么不同。您缺少字段之间的OFS打印。循环应该在@EdMorton结束,谢谢你的建议。非常感谢!我已经编辑过了。解决方案在每一行的末尾添加now和additonal OFS,但这应该足够好,因为OFS是一个空格。永远不要使用格式字段printf$c[i]中的输入数据进行printf,而是使用完整的printf大纲printf%s,$c[i]。想象一下,如果$c[i]包含一个printf格式字符串,例如%s,会有什么不同。您缺少字段之间的OFS打印。循环应该在@EdMorton结束,谢谢你的建议。非常感谢!我已经编辑过了。该解决方案在每一行的末尾添加now和additonal OFS,但由于OFS是一个空格,因此应该足够好了。