在数组中插入多行并在 bash 中比较数组

insert multiple line in array and compare array in bash

我正在尝试使用 bash 4.1 转换数组(文件 c)。我也尝试过 python/numpy 但我是新手,我还不太了解它。这是我的问题:

我有以下数组:

1 E
2 A
3 Z
5 R
6 A
8 A

我想在我的数组中有一个大于 1 的增量时添加一行:

1 E
2 A 
3 Z
4 change 
5 R
6 A
7 change
8 A

我试着用这段代码来做到这一点:

        i=1
        while read s t; do
             if [[ $i = $s ]];
             then echo "$s $t" >> e
             else echo "$i change" >> e ; s=$s[$(($i-1))]
             fi

        i=$(($i+1))
        done < c

但我得到了这个结果:

1 E
2 A 
3 Z
4 change 
5 change
6 change
7 change
8 change

你能帮我解决这个问题吗? 提前, 谢谢! 巴萨拉布

在原生 bash 中逐行处理文件中的行很少是最佳方法。这是您可以使用标准工具 awk 执行此操作的一种方法,该工具旨在处理这种形式的数据:

awk '{while(!=++last)print last+1,"change"}{last=;print}' file.txt

Awk 逐行处理文件中的每一行。直到第一个字段的值与last+1相同,插入一行"change"。始终打印正在处理的当前记录,并将第一个字段的当前值保存到变量last,以便在处理下一行时使用。

awk 中常见的 shorthand 可用于消除对第二个 print 的需要:

awk '{while(!=++last)print last+1,"change"}{last=}1' file.txt

awk 脚本的格式是 rule { action }。默认操作是 {print} 并且 1 是最短的规则,总是评估为真,所以每一行都被打印出来。

你可以在 bash 做到这一点,你离它不远:

#!/bin/bash
i=1
while read s t;
do
    while [[ $s != $i ]]
    do
        echo "$i change"
        i=$((i+1))
    done
    echo "$s $t"
    i=$((i+1))
done < c

现在您可以:./bash_script > output将其写入文件。