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

时间:2017-12-09 22:51:21

标签: arrays bash multidimensional-array awk

你好,这是关于数组和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阵列看起来像是:

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]

实际所需的输出是在弄乱排序之后通过索引对齐2个数组。因此,在弄乱它们之后,所需的输出是b,然后我需要根据INDEX NUMBERS在它们旁边显示相应的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个数组彼此相邻他们的索引排成一行。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

由于awk数组没有排序,我假设你的'数组'是来自文件的行。如果是这种情况,请尝试:

$ 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索引下的数组a中保存每一行$2。然后,我们跳过其余命令并跳转到next行。

  • print $0,a[$2+0]

    在阅读第二个文件时,我们会在第二个字段$0的键下打印第二个文件a中的每一行和数组$2的值。

按顺序打印两个awk数组

在此示例中,我们使用split创建awk数组,然后按顺序打印:

$ 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