Различные результаты с использованием awk gensub в скрипте - PullRequest
0 голосов
/ 08 октября 2018

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

Метод 1:

echo "ABCD EFGH" | awk '{print gensub ( /( .+ ) ( .+ )/, "\\2 \\1", "g", $0 ) 
}'
> ABCD EFGH #no flip (not desired resutls) 

Метод 2:

cat > temp.sh
awk 'BEGIN {xx = "ABCD EFGH"
            xx_ = gensub(/(.+) (.+)/, "\\2 \\1", "g", xx)
            print xx_
            }'
sh temp.sh
> EFGH ABCD  ## desired results 

Что дает?Что мне нужно исправить в методе 1?Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

У вас уже есть объяснение, почему ваше регулярное выражение не работает.Поэтому я просто укажу, что вы пишете в GNU awk, а gensub() не существует в большинстве других awk.

Поэтому вместо переносимости я предлагаю вам поменять поляпо-другому:

$ echo "ABCD EFGH" | awk '{for(i=NF;i;i--) o=o OFS $i; print substr(o,length(OFS)+1)}'

Это пошагово перебирает ваши поля в обратном порядке и добавляет их к переменной, разделенной вашим разделителем выходных полей.Затем он печатает переменную, удаляя OFS, как она идет.Он также работает с более чем 2 полями.

0 голосов
/ 08 октября 2018

Разве вы не узнаете очевидную опечатку в вашей первой команде наличия лишних пробелов в вашем совпадении с регулярным выражением?

echo "ABCD EFGH" | awk '{print gensub ( /( .+ ) ( .+ )/, "\\2 \\1", "g", $0 ) }'
#                                         ^  ^   ^  ^ incorrect spaces defined

Это должно было быть определено, как показано ниже.Кроме того, вам не нужно указывать $0 в последнем аргументе, как это понимается и необязательно, т. Е. Если $0 не упоминается явно, операция по умолчанию занимает все $0.

echo "ABCD EFGH" | awk '{print gensub ( /(.+) (.+)/, "\\2 \\1", "g") }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...