1

Я создал скрипт для awk. Я объединяю цикл "для" с "если". Он ищет в каждой строке слово "ABC", которое может встречаться в разных местах строки. Это выглядит ниже:

{for (i = 1; i <= NF; i++) if ($ i == "ABC") print $ (i-2)}

Проблема возникает, когда в строке нет буквы "ABC", и я хотел бы напечатать информацию о ней. С помощью скрипта, как показано ниже, он дает мне информацию для каждого слова из строки, которая отличается от "ABC", и я хотел бы получить только одну информацию для строки (не для каждого слова).

{для (i = 1; i <= NF; i++) if ($ i == "ABC") выведите $ (i-2)

иначе если ($ i == "ABC") выведите "no ABC in the line"}

С уважением, Лукас

2 ответа2

2

Вы сказали своему сценарию явно проверять каждое поле (слово) строки. Что вы хотите сделать, это просто проверить, содержит ли строка где-либо строку ABC:

awk '{
      if(/ABC/){
        printf "line %s contains ABC
      }
       else{
       printf "line %s does not contain ABC\n",NR
      }
     }' file.txt

Если вы запустите это для файла со следующим содержимым:

 this line has no string of interest
 this line contains ABC somewhere

ты получаешь:

line 1 does not contain ABC
line 2 contains ABC

Вы не объяснили, почему печатали $(i-2) но если это то, что вам действительно нужно, вы можете сделать:

awk '{k=0; for (i=1;i<=NF;i++){
            if ($i=="ABC"){print $(i-2); k++}
           } 
           if(k==0){print "No ABC in line",NR}
     }' file.txt

Хитрость заключается в переменной k . Он установлен в 0 в начале каждой строки. Когда вы просматриваете поля, если одно из них соответствует ABC , k устанавливается в 1 . Поэтому, как только все поля были обработаны, если k по-прежнему равно 0 , строка не содержит ABC и печатается сообщение. Выполнение этого сценария в файле примера, который я дал выше, печатает:

No ABC in line 1
line
0

Попробуйте объявить переменную isFound перед циклом for . После print $(i-2) установите для isFound значение true . Замените ваш текущий elseif оператором if говорящим, что если isFound имеет значение false, то не печатайте no ABC in line .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .