Как напечатать первое или второе слово в строке с помощью awk? - PullRequest
0 голосов
/ 01 марта 2019

Итак, у меня есть строка, состоящая из двух слов, где я хочу напечатать два слова по отдельности в awk (на самом деле gawk). Строка может выглядеть следующим образом:

str="ab cd"

Итак, я искалСеть и все, что я придумаю, это примеры, как разобрать это из файла.Тем не менее, это не работает в моем случае.Это было бы довольно легко сделать в Perl;Примерно так:

my $str="ab cd";
$str =~/(.+)\s(.+)/;
print "$1 and $2\n";

Однако в awk нет этой группировки.Проблема в том, что мне нужно сохранить ввод, поэтому split(), sub(), ... не помогут.Вероятно, это будет работать с match(), но это не так красиво.

Кто-нибудь, кто считает, что лучше?

Sample input: str="ab cd"
Sample output: "ab and cd"

Обратите внимание, что "и" не является частьюсоответствие, но должна быть возможность напечатать эту строку.

BR Patrik

Ответы [ 4 ]

0 голосов
/ 02 марта 2019

idk, что вы подразумеваете под любым из However, awk does not have this grouping. The problem is that I need to preserve the input, so split(), sub(), ... will not help. It would probaby work with match(), but this is not so pretty.

Эквивалент кода perl в вашем вопросе:

my $str="ab cd";
$str =~/(.+)\s(.+)/;
print "$1 and $2\n";

строка для строки, будет:

str="ab cd"
match(str,/(.+)\s(.+)/,a)
print a[1], "and", a[2]

например:

awk 'BEGIN {
    str="ab cd"
    match(str,/(.+)\s(.+)/,a)
    print a[1], "and", a[2]
}'
ab and cd

Я не знаю, является ли это лучшим способом сделать то, что вы действительно пытаетесь сделать, хотя я не знаю, что это вы?действительно пытаемся сделать!

0 голосов
/ 01 марта 2019

gnu awk, используйте форму с тремя аргументами функции match()

awk -v str="foo bar" 'BEGIN {
    if (match(str, /^(.+)[[:space:]]+(.+)/, m)) {
        print m[1], "and", m[2]
    }
}'
foo and bar
0 голосов
/ 01 марта 2019

Разделить строку с пробелом в массиве:

awk -v string="ab cd" 'BEGIN{split(string,array," "); print array[1],"and",array[2]}'

Вывод:

ab and cd
0 голосов
/ 01 марта 2019

GNU awk:

$ awk -v str="ab cd" 'BEGIN{print gensub(/(.+)\s(.+)/, "\\1 and \\2\n", 1, str)}'
ab and cd

Измените на -v str="$var", если хотите передать значение переменной в awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...