你好,这是我关于数组和bash脚本的第二个问题。谢谢!
我有2个阵列。一个数组是
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
另一个数组是
b[1]
b[2]
b[3]
b[4]
b[5]
b[6]
b[7]
b[8]
b[9]
b[10]
是否可以按任何方式打印/输出/对齐2,以使它们按照索引编号对齐,以便输出始终是相同的索引编号:
a[1] b[1]
a[2] b[2]
a[3] b[3]
a[4] b[4]
a[5] b[5]
a[6] b[6]
a[7] b[7]
a[8] b[8]
a[9] b[9]
a[10] b[10]
实际上,从一开始就将它们都不同。因此,实际上,第一个数组看起来像:
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
和第二个是由原始排序顺序不超出的,是
b[2]
b[4]
b[3]
b[5]
b[7]
b[6]
b[9]
b[1]
b[9]
b[8]
实际所需的输出将索引与排序弄乱后,通过索引对齐两个阵列。因此,所需的输出是与它们混乱后的B,然后我需要基于索引号的旁边A旁边的A。
b[2] a[2]
b[4] a[4]
b[3] a[3]
b[5] a[5]
b[7] a[7]
b[6] a[6]
b[9] a[9]
b[1] a[1]
b[10] a[10]
b[8] a[8]
这在bash/awk中是否可以?使用一个简单的多维阵列,这将变得容易得多。对于这种情况,我还没有围绕单个维度的关联阵列解决方案。
如果我有一个多维数组,我只需要在同一数组中的两个列中始终具有两个列的2个值,但在同一数组的不同维度中。这样,我可以按第二维进行排序,并且仍然有一个旁边的第一个维度以进行进一步计算。
由于缺乏bash/awk中的多维阵列,我只是依靠索引编号来保持它们都保持一致,但我不能这样做,因为我不知道如何用索引互相打印2个阵列向右排队。
我如何解决这个问题?
由于未订购尴尬阵列,我假设您的'数组'是文件中的行。如果是这样,请尝试:
$ awk -F'[][]' 'FNR==NR{a[$2+0]=$0; next} {print $0,a[$2+0]}' filea fileb
b[2] a[2]
b[4] a[4]
b[3] a[3]
b[5] a[5]
b[7] a[7]
b[6] a[6]
b[9] a[9]
b[1] a[1]
b[10] a[10]
b[8] a[8]
它如何工作
-F'[][]'
这告诉AWK使用
[
和]
作为场分离器。这样,我们感兴趣的数字是字段2。FNR==NR{a[$2+0]=$0; next}
读取第一个文件时,我们将每行
$0
保存在$2
索引下的数组a
中。然后,我们跳过其余的命令,跳到next
行。print $0,a[$2+0]
读取第二个文件时,我们从第二个文件(
$0
)中打印每行,以及第二个字段键下的数组a
的值,$2
。
打印两个尴尬阵列
在此示例中,我们使用 split
创建到尴尬阵列,然后按顺序打印:
$ awk 'BEGIN{split("a b c d",a); split("1 2 3 4",b); for (i=1;i<=length(a);i++)print a[i],b[i]}'
a 1
b 2
c 3
d 4