我有一个示例平面文件,其中包含以下块
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
但显然没有打印出所需的输出。 我错过了什么?请帮忙。
答案 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
不使用do
或done
。
-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