Авк, если ошибка условия

Как уже говорилось в комментариях, ваш раздел Linux поврежден, и вам следует как можно скорее сделать резервную копию.

Что касается причины этого, возможно, это связано с Windows 10. Я слышал о нескольких случаях, когда Win10 повреждала раздел Linux на машине с двойной загрузкой. (Связанные:Запуск Windows повреждает разделы ext4)Это также объясняет, почему раздел Win10 не затрагивается.

Решением для этого может быть перевод раздела Linux в автономный режим из Win10 через diskpart, как объясняется в этом ответе:https://askubuntu.com/questions/849872/how-can-i-prevent-windows-10-from-corrupting-the-ext4-superblock-every-time/858159#858159

0
22.12.2020, 21:54
4 ответа

Вам не хватает двух ),в качестве альтернативы один ), а затем иметь один (слишком много.

Исправлен код (с удалением лишних скобок; новые строки здесь только для иллюстрации, на самом деле это не запустится):

{
        if (
                substr($0,9,3) == "TGO" &&
                (
                        substr($0,1,4) == "9123" || substr($0,1,4) == "9704"
                )
        )
                print substr($0,279,2), substr($0,1,4), substr($0,5,8)
}

или (этот синтаксис правильный в отношении того, где расположены новые строки)

{
        if (substr($0,9,3) == "TGO" && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704" ))
                print substr($0,279,2), substr($0,1,4), substr($0,5,8)
}

или (с использованием шаблона -механики действия)

substr($0,9,3) == "TGO" && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704") {
        print substr($0,279,2), substr($0,1,4), substr($0,5,8)
}

Ваш код в том же формате, что и в первом варианте выше, но со всеми скобками.:

{
        # too many ( below
        if ((
                (substr($0,9,3) == "TGO") &&
                (
                        # missing ) below, alt. too many ( and )
                        (substr($0,1,4) == "9123" || (substr($0,1,4) == "9704")
                )
        )
                print (substr($0,279,2),substr($0,1,4),substr($0,5,8))
}
3
18.03.2021, 22:41

Я не уверен, так как вы не дали нам файл для тестирования, но я предполагаю, что это то, что вы хотели написать:

awk '{ if( substr($0,9,3) == "TGO" && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704")){ print substr($0,279,2),substr($0,1,4),substr($0,5,8)}}' Downloadfinance.txt

Или, чуть более разборчиво:

awk '{ 
        if( substr($0,9,3) == "TGO" && 
            (substr($0,1,4) == "9123" || substr($0,1,4) == "9704")){ 
                print substr($0,279,2),substr($0,1,4),substr($0,5,8)
            }
    }' Downloadfinance.txt
1
18.03.2021, 22:41

В качестве альтернативы вы можете переместить условие ifв предварительное условие правила :

.
awk  'substr($0,9,3) == "TGO"  && (substr($0,1,4) == "9123" || substr($0,1,4) == "9704"){
                print substr($0,279,2),substr($0,1,4),substr($0,5,8)
              }'

Вы также можете упростить его до:

awk 'substr($0,9,3) == "TGO"  && (/^9123/ || /^9704/) { print.... }'
1
18.03.2021, 22:41

ЕСЛИ вы используете GNU awk (или можете ), у него есть функция для прямой обработки этого:

awk -vFIELDWIDTHS="4 4 3 267 2" '$3=="TGO" && ($1=="9123"||$1=="9704"){ print $5,$1,$2 }'
0
18.03.2021, 22:41

Теги

Похожие вопросы