如何在 Unix 中进行索引到索引值的比较
How to do index to index value comparison in Unix
我有一个场景,我用 array_2 [index][=36= 做了 array_1 [index] 值检查]值。
我的以下代码运行得非常棒,但是有没有不同的方法来实现相同的目标?
我正在寻找一种处理 2 个数组列表值并进行比较的独特方法,
几行代码。
我的代码:
#!/bin/bash
array_1=(4 4 3)
array_2=(4 1 3)
i=''
j=''
count=0
for i in "${array_1[@]}"
do
i="cmd ${array_1[$count]}"
j="cmd ${array_2[$count]}"
if [ "$i" -eq "$j" ]
then
echo "${array_1[$count]} match with ${array_2[$count]}"
count=$(( count + 1 ))
else
echo "${array_1[$count]} does not match with ${array_2[$count]}"
exit 1
fi
done
注意:代码用shellcheck.net检查,没有发现错误。
如果两个数组有不同的值,下面是输出:
array_1=(4 4 3)
array_2=(4 1 3)
输出:
4 match with 4
4 does not match with 1
如果两个数组具有相同的值,则输出如下:
array_1=(4 4 3)
array_2=(4 4 3)
输出:
4 match with 4
4 match with 4
3 match with 3
关于你最近 shell 的其他问题,你根本不应该在 shell 中这样做,但由于你似乎专注于这样做,下面是如何做你正在做的事情的简要说明(减去确切的输出格式):
$ cat tst.sh
#!/usr/bin/env bash
array_1=(4 4 3)
array_2=(4 1 3)
diff -y <(printf '%s\n' "${array_1[@]}") <(printf '%s\n' "${array_2[@]}")
$ ./tst.sh
4 4
4 | 1
3 3
下面是如何在 shell 中编写问题中的代码(如果数组大小不同,现有代码将失败):
$ cat tst.sh
#!/usr/bin/env bash
array_1=(4 4 3)
array_2=(4 1 3)
size1=${#array_1[@]}
size2=${#array_2[@]}
if (( size1 > size2 )); then
maxSize=$size1
else
maxSize=$size2
fi
for (( i=0; i<maxSize; i++ )); do
val1=${array_1[i]}
val2=${array_2[i]}
if [ "$val1" -eq "$val2" ]
then
echo "${array_1[$i]} match with ${array_2[$i]}"
else
echo "${array_1[$i]} does not match with ${array_2[$i]}"
exit 1
fi
done
$ ./tst.sh
4 match with 4
4 does not match with 1
但更好的方法是:
$ cat tst.sh
#!/usr/bin/env bash
array_1=(4 4 3)
array_2=(4 1 3)
awk -v string_1="${array_1[*]}" -v string_2="${array_2[*]}" '
BEGIN {
size1 = split(string_1,array_1)
size2 = split(string_2,array_2)
maxSize = (size1 > size2 ? size1 : size2)
for (i=1; i<=maxSize; i++) {
val1 = array_1[i]
val2 = array_2[i]
if ( val1 == val2 ) {
printf "%s match with %s\n", array_1[i], array_2[i]
}
else {
printf "%s does not match with %s\n", array_1[i], array_2[i]
exit 1
}
}
}
'
$ ./tst.sh
4 match with 4
4 does not match with 1
您在问题中添加了 awk
。
使用 awk
你可以做:
awk 'FNR==NR{x[FNR]=; next}
x[FNR]=={print x[FNR] " match with " ; next}
{print x[FNR] " does not match with " }
' <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}")
或者使用 paste
和 awk
你可以这样做:
paste <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}") | awk '
=={print " match with " ; next}
{print " does not match with " }'
要么打印(在你的例子中有两个数组):
4 match with 4
4 does not match with 1
3 match with 3
如果想在第一个不匹配后退出,只需在print
:
后面加上exit
awk 'FNR==NR{x[FNR]=; next}
x[FNR]=={print x[FNR] " match with " ; next}
{print x[FNR] " does not match with " ; exit 1}
' <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}")
说明
printf "%s\n" "${array_1[@]}"
的构造将 array_1
的输出创建为由 \n
:
分隔的字符串
printf "%s\n" "${array_1[@]}"
4
4
3
构造:
cmdX <(cmdY)
执行以下操作:
- 根据
cmdY
和 的标准输出在 shell 中创建一个类似于 fifo 的匿名文件
- 将类似文件的输出的文件名作为参数输入
cmdX
,然后作为文件读取。
paste
采用两个类似文件的输入并创建一个两列的单一输出:
paste <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}")
4 4
4 1
3 3
一旦您将数组并排放置,或者就像两个文件一样,然后将两者与 awk
diff
comm
perl
或 ruby
进行比较微不足道。
我有一个场景,我用 array_2 [index][=36= 做了 array_1 [index] 值检查]值。
我的以下代码运行得非常棒,但是有没有不同的方法来实现相同的目标?
我正在寻找一种处理 2 个数组列表值并进行比较的独特方法, 几行代码。
我的代码:
#!/bin/bash
array_1=(4 4 3)
array_2=(4 1 3)
i=''
j=''
count=0
for i in "${array_1[@]}"
do
i="cmd ${array_1[$count]}"
j="cmd ${array_2[$count]}"
if [ "$i" -eq "$j" ]
then
echo "${array_1[$count]} match with ${array_2[$count]}"
count=$(( count + 1 ))
else
echo "${array_1[$count]} does not match with ${array_2[$count]}"
exit 1
fi
done
注意:代码用shellcheck.net检查,没有发现错误。
如果两个数组有不同的值,下面是输出:
array_1=(4 4 3)
array_2=(4 1 3)
输出:
4 match with 4
4 does not match with 1
如果两个数组具有相同的值,则输出如下:
array_1=(4 4 3)
array_2=(4 4 3)
输出:
4 match with 4
4 match with 4
3 match with 3
关于你最近 shell 的其他问题,你根本不应该在 shell 中这样做,但由于你似乎专注于这样做,下面是如何做你正在做的事情的简要说明(减去确切的输出格式):
$ cat tst.sh
#!/usr/bin/env bash
array_1=(4 4 3)
array_2=(4 1 3)
diff -y <(printf '%s\n' "${array_1[@]}") <(printf '%s\n' "${array_2[@]}")
$ ./tst.sh
4 4
4 | 1
3 3
下面是如何在 shell 中编写问题中的代码(如果数组大小不同,现有代码将失败):
$ cat tst.sh
#!/usr/bin/env bash
array_1=(4 4 3)
array_2=(4 1 3)
size1=${#array_1[@]}
size2=${#array_2[@]}
if (( size1 > size2 )); then
maxSize=$size1
else
maxSize=$size2
fi
for (( i=0; i<maxSize; i++ )); do
val1=${array_1[i]}
val2=${array_2[i]}
if [ "$val1" -eq "$val2" ]
then
echo "${array_1[$i]} match with ${array_2[$i]}"
else
echo "${array_1[$i]} does not match with ${array_2[$i]}"
exit 1
fi
done
$ ./tst.sh
4 match with 4
4 does not match with 1
但更好的方法是:
$ cat tst.sh
#!/usr/bin/env bash
array_1=(4 4 3)
array_2=(4 1 3)
awk -v string_1="${array_1[*]}" -v string_2="${array_2[*]}" '
BEGIN {
size1 = split(string_1,array_1)
size2 = split(string_2,array_2)
maxSize = (size1 > size2 ? size1 : size2)
for (i=1; i<=maxSize; i++) {
val1 = array_1[i]
val2 = array_2[i]
if ( val1 == val2 ) {
printf "%s match with %s\n", array_1[i], array_2[i]
}
else {
printf "%s does not match with %s\n", array_1[i], array_2[i]
exit 1
}
}
}
'
$ ./tst.sh
4 match with 4
4 does not match with 1
您在问题中添加了 awk
。
使用 awk
你可以做:
awk 'FNR==NR{x[FNR]=; next}
x[FNR]=={print x[FNR] " match with " ; next}
{print x[FNR] " does not match with " }
' <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}")
或者使用 paste
和 awk
你可以这样做:
paste <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}") | awk '
=={print " match with " ; next}
{print " does not match with " }'
要么打印(在你的例子中有两个数组):
4 match with 4
4 does not match with 1
3 match with 3
如果想在第一个不匹配后退出,只需在print
:
exit
awk 'FNR==NR{x[FNR]=; next}
x[FNR]=={print x[FNR] " match with " ; next}
{print x[FNR] " does not match with " ; exit 1}
' <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}")
说明
printf "%s\n" "${array_1[@]}"
的构造将 array_1
的输出创建为由 \n
:
printf "%s\n" "${array_1[@]}"
4
4
3
构造:
cmdX <(cmdY)
执行以下操作:
- 根据
cmdY
和 的标准输出在 shell 中创建一个类似于 fifo 的匿名文件
- 将类似文件的输出的文件名作为参数输入
cmdX
,然后作为文件读取。
paste
采用两个类似文件的输入并创建一个两列的单一输出:
paste <(printf "%s\n" "${array_1[@]}") <(printf "%s\n" "${array_2[@]}")
4 4
4 1
3 3
一旦您将数组并排放置,或者就像两个文件一样,然后将两者与 awk
diff
comm
perl
或 ruby
进行比较微不足道。