Не используйте backticks`. Вместо этого используйте $(..)
.
Поэтому вместо if ( "$i" == "$j" )
do if [ "$i" != "$j" ]
.
vec_fis_1
и vec_fis_2
не являются массивами - ${vec_fis_1[@]}
- это то же самое, что $vec_fis_1
.
Чтобы прочитать файл в массив, используйте readarray
.
Чтобы перебрать строки в файле, используйте while read loop
, см. bashfaq, как прочитать строку файла с помощью line .
while IFS= read -r l1; do
while IFS= read -r l2; do
if [ "$l1" != "$l2" ]; then
printf "%s\n" "$l1"
printf "%s\n" "$l2"
fi
done < fisier1.txt
done < fisier.txt
Мне нужны только различия между строками с одинаковым "индексом строки"
Так что считывайте из обоих файлов одновременно.
while IFS= read -r -u3 l1 &&
IFS= read -r -u4 l2; do
if [ "$l1" != "$l2" ]; then
printf "%s\n" "$l1"
printf "%s\n" "$l2"
fi
done 3< fisier.txt 4< fisier1.txt
Вы также можете обрабатывать различное количество строк. У меня есть эта (довольно многословная) идея:
while true; do
IFS= read -r -u3 l1
l1valid=$?
IFS= read -r -u4 l2
l2valid=$?
if ((l1valid != 0 || l2valid != 0)); then
if ((l1valid != 0 && l2valid == 0)); then
echo "file1 is longer then file2"
elif ((l1valid == 0 && l2valid != 0)); then
echo "file1 is shorter then file2"
fi # l1valid != 0 && l2valid != 0 - all fine
break;
fi
if [ "$l1" != "$l2" ]; then
printf "%s\n" "$l1"
printf "%s\n" "$l2"
fi
done 3< fisier.txt 4< fisier1.txt
или как:
while
IFS= read -r -u3 l1
l1valid=$?
IFS= read -r -u4 l2
l2valid=$?
if ((l1valid != 0 && l2valid == 0)); then
echo "file1 is longer then file2"
elif ((l1valid == 0 && l2valid != 0)); then
echo "file1 is shorter then file2"
fi
(( l1valid == 0 && l2valid == 0 ))
do
if [ "$l1" != "$l2" ]; then
printf "%s\n" "$l1"
printf "%s\n" "$l2"
fi
done 3< fisier.txt 4< fisier1.txt
Обратите внимание, что bash петли очень медленные, с awk они будут на несколько быстрее:
awk -vother="fisier1.txt" '{ t=$0; getline < (other); if (t != $0) print $0 RS t }' fisier.txt