我有两个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
.
.
.
这是我想要做的:
在 file2.txt 的DESC列中提取元素,然后在 file1.txt 中找到相应的元素。
在 file2.txt 的这一行中提取W,S元素,然后在 file1.txt 的这一行中找到相应的W,S元素。< / p>
如果[W1==W2 && S1==S2];
则echo "${DESC[colindex]} ok";
其他echo "${DESC[colindex]} NG"
如何将此类文件作为带有bash的2D数组读取,或者有任何方便的方法吗?
答案 0 :(得分:0)
bash不支持2D数组。您可以通过生成像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
为简洁起见,省略了利用排序顺序等优化措施。
如果文件实际上包含标题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
OK
NG