仅基于相同索引编号对齐数组



你好,这是我关于数组和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

最新更新