У меня есть файл списка со многими разными столбцами и хочу знать, когда следующее значение в третьем столбце равно текущему значению в третьем столбце. Моя проблема в том, эти значения являются каталогами, глядя, как это:Проблема с оператором 'if' в скрипте
/media/user/DATA/Folder1/File1.extension
/media/user/DATA/Folder1/File1.extension
/media/user/DATA/Folder1/File2.extension
/media/user/DATA/Folder1/File2.extension
/media/user/DATA/Folder2/File3.extension
/media/user/DATA/Folder2/File4.extension
/media/user/DATA/Folder2/File5.extension
/media/user/DATA/Folder3/File6.extension
/media/user/DATA/Folder4/File6.extension
У меня есть файлы с таким же именем в той же папке (которая должна рассматриваться как равноценные), тем же именем в разных папках (должны быть распознаются как разные значения) и той же папке, но разные имена (разные значения).
То, что я пытался сделать, это сортировать их все (с сортировкой -k 3,3), а затем сделать четвертый столбец, говоря, что следующее значение такое же, как в столбце или нет, что-то похожее как это:
/media/user/DATA/Folder1/File1.extension Y
/media/user/DATA/Folder1/File1.extension N
/media/user/DATA/Folder1/File2.extension Y
/media/user/DATA/Folder1/File2.extension N
/media/user/DATA/Folder2/File3.extension N
/media/user/DATA/Folder2/File4.extension N
/media/user/DATA/Folder2/File5.extension N
/media/user/DATA/Folder3/File6.extension N
/media/user/DATA/Folder4/File6.extension N
Я придумал этот код, чтобы сделать это, но он продолжает показывать ошибки при сопоставлении R1 с LastR1, которые я думаю, может быть связано с «/» в строках ...
echo "N" > LastR1.kp
sort -k3,3 list > list.tmp
mv list list.backup
mv list.tmp list
while read T1 T2 R1; do
LastR1=`cat LastR1.kp`
if [ $R1 == $LastR1 ]
then
KeepR1="Y"
else
KeepR1="N"
fi
echo "$KeepR1" > CKeep.kp
cat KeepList.kp CKeep.kp > KeepList.kp
done
sed -i -e 1,2d KeepList
join list KeepList > list.tmp
mv list.tmp list
Итак, что бы я имел в конце, это был бы мой оригинальный файл с четвертой колонкой с Y (для «следующая строка имеет то же значение в третьем столбце) или N (для« другого значения в следующей строке »). Кажется, я не могу найти причину, по которой мое заявление не работает. И хотя я думаю, что этот подход может делать то, что мне нужно, я определенно открыт для разных подходов.
Каков вклад в цикл 'while read'? – codeforester
Какая ошибка вы получаете? '==' inside '[...]' поддерживается некоторыми оболочками, но не все. – chepner
Ввод был файл списка, с разными каталогами, забыл поместить его здесь как-то, но это файл .sh. Я использовал тест с A/A, A/B. A/C, B/A для Каталогов и получил это сообщение об ошибке ./testes.sh: 7: [: A/A: неожиданный оператор ./testes.sh: 7: [: A/B: неожиданный оператор ./testes.sh: 7: [: A/B: неожиданный оператор ./testes.sh: 7: [: A/C: неожиданный оператор ./testes.sh: 7: [: B/A: неожиданный оператор Вот почему я подумал, что проблема «/» была проблемой (чтение как «деление») Теперь удалось заставить его работать с «[[]]» и «#!/usr/bin/env bash ", спасибо :) –