如何使用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)
以下是我想做的:
[W1==W2&&S1==S2]代码>然后回显“${DESC[colindex]}确定”
elseecho“${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