全部
我有两个 2D 数组文件可以用 bash 读取
文件1.txt (nx6)
DESC1 DM1 W1 S1 CRITICAL1 GRADE1 #this line dosen't exist
EEE 1x 9 6 Y E2
AAA X 1 2 Y E2
C+C X 8 1 Y T1
HHH 1x 5 5 Y T2
III X 5 5 Y S1
JJJ X 5 5 Y S1
D+ X 2 3 Y T1
文件2.txt (mx3)
DESC2 W2 S2 #this line dosen't exist
AAA 1 2
EEE 9 5
FFF 10 7
GGG 4 9
III 5 5
C+C 8 1
D+ 2 3
JJJ 5 5
我想要做的是提取两个文件中的元素,然后进行一些比较,如下图所示:
我真正想做的绿色标签是获取 $DESC1 中的一个元素并与 ${DESC2[@]} 中的整个元素进行比较,如果它在 ${DESC2[@]} 中找到/没有找到元素然后反馈true/false
这是我的工作:
#!/bin/bash
clear
ESC=`printf "\033"`
##===================================================================##
##===================================================================##
##========== read information from file1.txt and file1.txt ==========##
##===================================================================##
##===================================================================##
idx1=0
while read -a file1array$idx1; do
let idx1++
done < file1.txt
idx2=0
while read -a file2array$idx2; do
let idx2++
done < file2.txt
##===================================================================##
##===================================================================##
##================ start to compare these two files =================##
##===================================================================##
##===================================================================##
for ((i=0; i<idx1; i++)); do
for ((j=0; j<idx2; j++)); do
DESC1="file1array$i[0]"
DM1="file1array$i[1]"
W1="file1array$i[2]"
S1="file1array$i[3]"
CRITICAL1="file1array$i[4]"
GRADE1="file1array$i[5]"
DESC2="file2array$j[0]"
W2="file2array$j[1]"
S2="file2array$j[2]"
[ $i == 0 ] && LOSSarray+=(["$j"]="${!DESC2}")
if [[ "${!GRADE1}" == [E-GT-Z][1-9] && "${!DESC1}" == "${!DESC2}" ]]; then
W1_Judge=`expr "scale=3; ${!W1} - ${!W2}" | bc`
S1_Judge=`expr "scale=3; ${!S1} - ${!S2}" | bc`
[ $W1_Judge != 0 -o $S1_Judge != 0 ] && declare -A jgWS=( ["${!DESC1}"]="WSNG" )
elif [[ "${!GRADE1}" == [E-GT-Z][1-9] && "$j" == `expr $idx2 - 1` ]]; then
[[ -z $(echo "${LOSSarray[@]}" | grep -o "${!DESC1}") && "${!CRITICAL1}" != "NULL" ]] && declare -A jgLOSS=( ["${!DESC1}"]="LOSSNG" )
elif [[ "${!GRADE1}" != [E-GT-Z][1-9] && "${!DESC1}" == "${!DESC2}" ]]; then
[[ "${!DM1}" == [1-2]x* || "${!DM1}" == "X" ]] && declare -A jgEXTRA=( ["${!DESC1}"]="EXTRANG" )
fi
done
if [[ "${jgWS[${!DESC1}]}" == "WSNG" ]]; then
echo "${!DESC1}: ${ESC}[0;31mWidth or Space NG${ESC}[0m"
elif [[ "${jgLOSS[${!DESC1}]}" == "LOSSNG" ]]; then
echo "${!DESC1}: ${ESC}[0;31mLOSS NG${ESC}[0m"
elif [[ "${jgEXTRA[${!DESC1}]}" == "EXTRANG" ]]; then
echo "${!DESC1}: ${ESC}[0;31mEXTRA NG${ESC}[0m"
else
echo "${!DESC1}: OK"
fi
done
可以继续执行整个脚本并输出以下结果:
EEE: Width or Space NG
AAA: OK
C+C: OK
HHH: LOSS NG
III: EXTRA NG
JJJ: EXTRA NG
D+: OK
但是如果我像这样更改 file1.txt(将带有“D+”的行更改为 line1):
D+ X 2 3 Y T1
EEE 1x 9 6 Y E2
AAA X 1 2 Y E2
C+C X 8 1 Y T1
HHH 1x 5 5 Y T2
III X 5 5 Y S1
JJJ X 5 5 Y S1
我得到以下结果:
D+: syntax error: operand expected (error token is "+")
如果我不想编辑 file1.txt,如何解决这个问题?
如何将 file2.txt 的第一列读取为数组,而无需在 for 循环中执行此操作?
最佳答案
问题是,如果您尝试使用 +
访问未声明数组的元素,bash 会抛出错误。例如:
$ echo "${arr[D+]}"
-bash: D+: syntax error: operand expected (error token is "+")
$ echo "${arr[foo]}" # works
但是,如果您先声明数组,它就会起作用:
$ declare -A arr
$ echo ${arr[D+]} # works
因此,您需要确保在访问数组 jgWS
、jgLOSS
和 jgEXTRA
之前已经预先声明了它们你的 if 语句。
例如,当前仅当满足以下条件时才声明 jgWS
数组:[ $W1_Judge != 0 -o $S1_Judge != 0 ]
。稍后,您尝试在此处使用该数组: if [[ "${jgWS[${!DESC1}]}"== "WSNG"]]
,但它可能尚未初始化,在这种情况下它会失败。
关于bash - 随机语法错误!?使用包含 "operand"的键进行关联数组扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22606028/