2017-01-07 5 views
0

У меня есть файл списка со многими разными столбцами и хочу знать, когда следующее значение в третьем столбце равно текущему значению в третьем столбце. Моя проблема в том, эти значения являются каталогами, глядя, как это:Проблема с оператором '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 (для« другого значения в следующей строке »). Кажется, я не могу найти причину, по которой мое заявление не работает. И хотя я думаю, что этот подход может делать то, что мне нужно, я определенно открыт для разных подходов.

+0

Каков вклад в цикл 'while read'? – codeforester

+0

Какая ошибка вы получаете? '==' inside '[...]' поддерживается некоторыми оболочками, но не все. – chepner

+0

Ввод был файл списка, с разными каталогами, забыл поместить его здесь как-то, но это файл .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 ", спасибо :) –

ответ

0

Не уверен, что вы используя bash или sh. Добавьте притон линию на верхней части вашего скрипта:

#!/usr/bin/env bash 

и изменить условие if использовать [[ ]]:

if [[ $R1 == $LastR1 ]] 

Я надеюсь, что это позволит решить вашу проблему.

+0

Я использую sh, не уверен, почему я даже добавил bash там, извините: s –

+0

Это сработало, спасибо. Также мне пришлось изменить свою функцию «join», если кто-то сталкивается с аналогичной проблемой, вместо этого использует функцию вставки (вставить файл file1 file2). Благодаря! –

Смежные вопросы