如何使用awk仅解析选定的列值

时间:2014-11-19 08:18:35

标签: arrays unix awk

我有一个示例平面文件,其中包含以下块

test my array which array is better array huh got it?

INDIA USA SA NZ AUS ARG ARM ARZ GER BRA SPN

我也有一个像这样定义的数组(ksh_arr2)

ksh_arr2=$(awk '{if(NR==1){for(i=1;i<=NF;i++){if($i~/^arr/){print i}}}}' testUnix.txt)

并包含以下整数

3 5 8

现在我只想解析那些位于相应编号位置的列值,即第五和第五位。 我也想要病房第二行的输出。 所以我尝试了以下

awk '{for(i=1;i<=NF;i++){if(NR >=1 && i=${ksh_arr2[i]}) do print$i ; done}}' testUnix.txt 

但显然没有打印出所需的输出。 我错过了什么?请帮忙。

3 个答案:

答案 0 :(得分:2)

我将如何接近它

awk -vA="${ksh_arr2[*]}" 'BEGIN{split(A,B," ")}{for(i in B)print $B[i]}' file

解释

 -vA="${ksh_arr2[*]}"     -    Set variable A to expanded ksh array

  'BEGIN{split(A,B," ")   -    Splits the expanded array on spaces
                               (effictively recreating it in awk)

  {for(i in B)print $B[i]} -  Index in the new array print the field that is the number 
                              contained in that index

修改

如果您想在打印时保留字段的顺序,那么这将更好

awk -vA="${ksh_arr2[*]}" 'BEGIN{split(A,B," ")}{while(++i<=length(B))print $B[i]}' file

答案 1 :(得分:1)

由于未显示样本输出,因此我不知道此输出是否符合您的要求。它是从提供的代码中获得的输出,其中包含使其运行所需的最小更改:

$ awk -v k='3 5 8' 'BEGIN{split(k,a," ");} {for(i=1;i<=length(a);i++){print $a[i]}}' testUnix.txt 
array
array
array



SA
AUS
ARZ

上面的代码按照变量k提供的相同顺序打印出选定的列。

注释

  • awk代码从未定义ksh_arr2。我假设这个数组的值是从shell传入的。这里使用-v选项将变量k设置为ksh_arr2的值。

  • 无法直接传入awk数组。如上所述,可以传入一个字符串,然后使用split函数将其转换为数组。字符串k上方已转换为awk数组a

  • awk语法与shell语法不同。例如,awk不使用dodone

详细信息

  • -v k='3 5 8'

    这定义了awk变量k。要以编程方式执行此操作,请使用shell中的字符串或数组替换3 5 8

  • BEGIN{split(k,a," ");}

    这会将变量k中以空格分隔的值转换为名为a的数组。

  • for(i=1;i<=length(a);i++){print $a[i]}

    按顺序打印出数组a中的每一列。

备用输出

如果您想将每行的输出保持在一行:

$ awk -v k='3 5 8' 'BEGIN{split(k,a," ");} {for(i=1;i<length(a);i++) printf "%s ",$a[i]; print $a[length(a)]}' testUnix.txt 
array array array

SA AUS ARZ

答案 2 :(得分:0)

awk 'NR>=1 { print $3 " " $5 " " $8 }' testUnix.txt