awk从输入列表

时间:2015-06-06 13:05:21

标签: 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

因此,按顺序选择了第3,第2,第6和第4列。

谢谢

2 个答案:

答案 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 colsNR的第一行(也是唯一一行)时,FNR的值为1,表示执行以下块。

{n=split($0,c);next}使用全局字段分隔符将存储在$0中的整行拆分到数组c中,并保存要在n中打印的列数。我们稍后会在for循环中使用nnext告诉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