如何使用bash比较两个二维数组文件?

如何使用bash比较两个二维数组文件?,bash,multidimensional-array,Bash,Multidimensional Array,我有两个二维数组文件要用bash读取 我想做的是提取两个文件中的元素 这两个文件包含不同的行x列,例如: file1.txt(nx7) file2.txt(mx3) 以下是我想做的: 提取file2.txt的DESC列中的元素,然后在file1.txt中找到相应的元素 在file2.txt的这一行中提取W,S元素,然后在file1.txt的这一行中找到相应的W,S元素 如果[W1==W2&&S1==S2]然后回显“${DESC[colindex]}确定”elseecho“${DESC[colin

我有两个二维数组文件要用
bash
读取

我想做的是提取两个文件中的元素

这两个文件包含不同的行x列,例如:

file1.txt(nx7)

file2.txt(mx3)

以下是我想做的:

  • 提取file2.txt的DESC列中的元素,然后在file1.txt中找到相应的元素

  • file2.txt的这一行中提取W,S元素,然后在file1.txt的这一行中找到相应的W,S元素

  • 如果
    [W1==W2&&S1==S2]然后
    回显“${DESC[colindex]}确定”
    else
    echo“${DESC[colindex]}NG”


  • 如何使用bash将此类文件读取为二维数组,或者是否有任何方便的方法来执行此操作?

    bash不支持二维数组。您可以通过生成一维数组变量来模拟它们,如
    array1
    array2
    ,等等

    假设DESC是一个键(即没有重复的值),并且不包含任何空格:

    #!/bin/bash
    
    # read data from file1
    idx=0
    while read -a data$idx; do
        let idx++
    done <file1.txt
    
    # process data from file2
    while read desc w2 s2; do
        for ((i=0; i<idx; i++)); do
            v="data$i[1]"
            [ "$desc" = "${!v}" ] && {
                w1="data$i[4]"
                s1="data$i[5]"
                if [ "$w2" = "${!w1}" -a "$s2" = "${!s1}" ]; then
                    echo "$desc ok"
                else
                    echo "$desc NG"
                fi
                break
            }
        done
    done <file2.txt
    
    #/bin/bash
    #从文件1读取数据
    idx=0
    读取时-数据$idx;做
    让idx++
    
    完成如果不需要保留行顺序(可以排序),可能这就足够了:

    join -2 2 -o 1.1,1.2,1.3,2.5,2.6 <(tail -n +2 file2.txt|sort) <(tail -n +2 file1.txt|sort) |\
        sed 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\) \2 \3/\1 OK/' |\
        sed '/ OK$/!s/\([^ ]*\) .*/\1 NG/'
    
    和file2.txt

    DESC W S 
    AAA 000 100 
    CCC 135 135
    EEE 789 000
    FCK xxx 135
    
    产生:

    AAA NG
    CCC OK
    EEE NG
    
    说明:

    • 跳过两个文件中的标题行-
      tail+2
    • 排序
      两个文件
    • join
      将两个文件中所需的列合并到一个表中,例如,在结果中将只显示具有公共描述字段的行
    像下一个:

    AAA 000 100 100 100
    CCC 135 135 135 135
    EEE 789 000 789 789
    
    • 在第2-4列和第3-5列中具有相同值的行中,用
      OK
    • 在其余行中,用
      NG

    查看
    join
    命令。等待@Kent的回答,他肯定会发布一个最多30个字符的awk脚本;)至少在GNUtail中,指定
    +2
    需要在其前面使用
    -n
    ,如
    tail-n+2
    。否则,“+2”将被解释为一个文件名。谢谢你的解释,这对我来说也很有帮助!现在我知道了如何用bash模拟二维阵列,这对我非常有用!
    DESC W S 
    AAA 000 100 
    CCC 135 135
    EEE 789 000
    FCK xxx 135
    
    AAA NG
    CCC OK
    EEE NG
    
    AAA 000 100 100 100
    CCC 135 135 135 135
    EEE 789 000 789 789