【问题标题】:Align arrays based on same index numbers alone?仅根据相同的索引号对齐数组?
【发布时间】:2018-05-23 20:42:30
【问题描述】:

您好,这是我关于数组和 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 个彼此相邻的数组排好队。

我该如何解决这个问题?

【问题讨论】:

  • 你的意思是数组的排序方式不同?你的意思是迭代顺序是通过其他方式给出的吗?在 awk 中,您可以对数组进行排序并检索索引顺序。也许问实际问题而不是派生问题会有所帮助!?
  • 这里的导数 =)
  • bash 和 awk 是完全不同的工具,每个都有自己的语法和语义。您是在询问 bash 数组或 awk 数组还是其他什么? awk 数组是关联的,并且没有与其索引关联的特定顺序,所以当你说They are actually both sorted out differently from the start 时,请理解你的意思。 FWIW GNU awk 具有多维数组,您可以使用in 循环(谷歌sorted_in)对索引进行排序,以便输出。

标签: arrays bash multidimensional-array awk


【解决方案1】:

由于 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,以及第二个字段 $2 下的数组 a 的值。

按顺序打印两个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2019-12-13
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多