Заключите в кавычки специальный символ в файле сценария с помощью awk

ram="rambo"

ram1="rimbo"

awk -v ram=$ram -v ram1=$ram1 '{ for (i=1;i<=length(ram);i++) { if (substr(ram,i,1) != substr(ram1,i,1)) { count++ } }} END { print (count/length(ram)*100"% difference") }' <<< ""

выход:

20% difference

В приведенном выше примере предполагалось, что обе переменные ram и ram1 всегда имеют одинаковую длину. Мы передаем обе переменные в awk и сравниваем каждый символ один за другим с одним в другой строке, отслеживая различия с помощью переменной count.

В конце мы вычисляем процентную долю отличающейся строки.

0
03.12.2019, 02:32
1 ответ

Правильный синтаксис:awk '-F[|]' '{ print $2 }'

|является специальным символом оболочки , поэтому его необходимо заключать в кавычки, чтобы оболочка не пыталась создать конвейер.

Но |также является специальным символом awk , используемым для разделения альтернативных шаблонов в регулярном выражении. Лучший способ процитировать это — сделать его диапазоном, состоящим из одного символа, как [|]. Опция -F устанавливает переменную awk FS (Разделитель полей ), которая используется как регулярное выражение (RE, шаблон ).

Тогда все это нужно заключить в кавычки, потому что [..]также может быть специальным символом оболочки, который расширяет имена файлов.

'$2\n'— действующая awk-программа, но она не делает того, что вы ожидаете. Он находится в положении паттерна без действия. Таким образом, если $2 не -пусто, шаблон имеет значение True, и печатается вся строка.

Вам нужно действие, что и делает { }, и вы хотите выбрать только одно поле и напечатать его. Он не нуждается в новой строке. --print делает это автоматически.

2
28.01.2020, 02:38

Теги

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