我想要一个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
因此,按顺序选择了第3,第2,第6和第4列。
谢谢
答案 0 :(得分:3)
您可以使用:
team runs occurrences
team 1 5 3
team 2 5 1
我们将两个输入文件传递给awk,首先是cols然后是文本。 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
cols
和NR
的第一行(也是唯一一行)时,FNR
的值为1
,表示执行以下块。
{n=split($0,c);next}
使用全局字段分隔符将存储在$0
中的整行拆分到数组c
中,并保存要在n
中打印的列数。我们稍后会在for循环中使用n
。 next
告诉awk
停止处理当前行并读取下一行输入。
块{for(i=1;i<=n+1;i++){printf "%s",$c[i],OFS};print ""}
在所有其他行上执行,因为它没有前缀条件。 for
循环遍历cols
并打印由输出文件分隔符 OFS
分隔的相应列。最后我们打印一个新行。
输出:
c b f d
j i m k
答案 1 :(得分:3)
$ awk 'NR==FNR{n=split($0,f);next} {for (i=1;i<=n;i++) printf "%s%s", $(f[i]), (i<n?OFS:ORS)}' cols text
c b f d
j i m k