如何使用awk打印字符串中的第一个或第二个单词?

时间:2019-03-01 17:01:31

标签: awk

所以我有一个由两个单词组成的字符串,在这里我想用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 帕特里克

4 个答案:

答案 0 :(得分:3)

GNU awk:

weld-se-shaded

如果要将变量值传输到weld-se-core,请更改为$ awk -v str="ab cd" 'BEGIN{print gensub(/(.+)\s(.+)/, "\\1 and \\2\n", 1, str)}' ab and cd

答案 1 :(得分:2)

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代码等效的gawk:

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

我不知道这是否是您真正尝试做的最好的方法,因为我不知道您实际上是在尝试什么!

答案 2 :(得分:1)

gnu awk,使用match()函数的3参数形式

awk -v str="foo bar" 'BEGIN {
    if (match(str, /^(.+)[[:space:]]+(.+)/, m)) {
        print m[1], "and", m[2]
    }
}'
foo and bar

答案 3 :(得分:1)

将带有空格的字符串分割为数组:

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

输出:

ab and cd