如何将两个2D数组文件与bash进行比较?

时间:2014-02-26 15:55:28

标签: bash multidimensional-array

我有两个2D数组文件可以用bash读取。

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

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

file1.txt(nx7)

NO DESC ID TYPE W S GRADE
1 AAA 20 AD 100 100 E2 
2 BBB C0 U 200 200 D 
3 CCC 9G R 135 135 U1 
4 DDD 9H Z 246 246 T1 
5 EEE 9J R 789 789 U1 
.
.
.

file2.txt(mx3)

DESC W S 
AAA 100 100 
CCC 135 135
EEE 789 789
.
.
.

这是我想要做的:

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

  2. file2.txt 的这一行中提取W,S元素,然后在 file1.txt 的这一行中找到相应的W,S元素。< / p>

  3. 如果[W1==W2 && S1==S2];echo "${DESC[colindex]} ok";其他echo "${DESC[colindex]} NG"

  4. 如何将此类文件作为带有bash的2D数组读取,或者有任何方便的方法吗?

2 个答案:

答案 0 :(得分:0)

bash不支持2D数组。您可以通过生成像array1array2等一维数组变量来模拟它们。

假设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

为简洁起见,省略了利用排序顺序等优化措施。

如果文件实际上包含标题NO DESC ID TYPE ...,请在处理之前使用tail -n +2将其丢弃。

也可以使用更优雅的解决方案,避免在内存中读取整个文件。这应该仅适用于非常大的文件。

答案 1 :(得分:0)

如果不需要保存行顺序(可以排序),也许这就足够了:

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/'

对于file1.txt

NO DESC ID TYPE W S GRADE
1 AAA 20 AD 100 100 E2 
2 BBB C0 U 200 200 D 
3 CCC 9G R 135 135 U1 
4 DDD 9H Z 246 246 T1 
5 EEE 9J R 789 789 U1 

和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
  • sort两个文件
  • join从两个文件中所需的列到一个表中,在结果中只显示具有常见DESC字段的行

喜欢下一个:

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