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

如何使用awk打印字符串中的第一个或第二个单词?,awk,Awk,所以我有一个由两个单词组成的字符串,我想在awk中分别打印这两个单词(实际上是gawk) str="ab cd" my $str="ab cd"; $str =~/(.+)\s(.+)/; print "$1 and $2\n"; 所以我在网上搜索了一下,我找到的所有例子就是如何从一个文件中解析它。然而,这在我的情况下不起作用。用perl很容易做到这一点;像这样的, str="ab cd" my $str="ab cd"; $str =~/(.+)\s(.+)/; print "$1 an

所以我有一个由两个单词组成的字符串,我想在awk中分别打印这两个单词(实际上是gawk)

str="ab cd"
my $str="ab cd";
$str =~/(.+)\s(.+)/;
print "$1 and $2\n";
所以我在网上搜索了一下,我找到的所有例子就是如何从一个文件中解析它。然而,这在我的情况下不起作用。用perl很容易做到这一点;像这样的,

str="ab cd"
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"
请注意,“and”不是匹配的一部分,但应该可以打印该字符串

溴 帕特里克

GNU awk:

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

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

更改为
-v str=“$var”
如果要将变量值传输到
awk

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

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

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

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

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

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

ab and cd ab和cd
将带空格的字符串拆分为数组:

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

ab and cd ab和cd
idk您所说的
中的任何一个的意思,但是,awk没有这个分组。问题是我需要保留输入,所以split(),sub()。。。不会有帮助的。使用match()可能会有问题,但这不是很好。

问题中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]
e、 g:


我不知道这是否是做你真正想做的事情的最好方式,因为我不知道你真正想做的是什么

idk您所说的
中的任何一个的意思,但是,awk没有这个分组。问题是我需要保留输入,所以split(),sub()。。。不会有帮助的。使用match()可能会有问题,但这不是很好。

问题中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]
e、 g:



我不知道这是否是做你真正想做的事情的最好方式,因为我不知道你真正想做的是什么

如果你只是想打印它(不确定我是否得到了正确的结果),请在你的帖子中发布预期输出的样本,然后让我们知道。尝试像
echo“$str”|awk'{print$1,$2}'
或者如果您想将shell变量作为变量传递给
awk
,然后尝试
awk-v str=“$str”'BEGIN{split(str,array)”;print array[1],array[2]
在第二个解决方案中,您无需提及任何输入文件,因为我只使用了
BEGIN
部分,让我知道?你能解释一下为什么拆分和匹配是不够的吗?如果你只有一个字符串,就不需要awk:str=“ab cd”;printf“%s”和%s\n'$str。如果它是一个文件,您必须告诉更多。请在您的帖子中发布预期输出的示例,然后让我们知道。如果您只是想打印它(不确定我是否正确获得它)。尝试像
echo“$str”|awk'{print$1,$2}'
或者如果您想将shell变量作为变量传递给
awk
,然后尝试
awk-v str=“$str”'BEGIN{split(str,array)”;print array[1],array[2]
在第二个解决方案中,您无需提及任何输入文件,因为我只使用了
BEGIN
部分,让我知道?你能解释一下为什么拆分和匹配是不够的吗?如果你只有一个字符串,就不需要awk:str=“ab cd”;printf“%s”和%s\n'$str。如果它是一个文件,您必须告诉它更多信息。这看起来似乎有效。我实际上有两个不同的字符串(相同的格式),并希望生成一个类似“$1:$2_1,$2_2”的字符串,其中$2_是第一个和第二个字符串的伪代码。无论如何,只要稍加修改(
gensub(/(.+)\s(+)\s(+)\s(+)/,“\\1:\\2->\\4”,1,str“str2”)
),就可以实现这一点。说真的,这肯定是我得到的最快的答案。谢谢@patrik Fyi:Awk的正则表达式没有perl的强大,它是ERE的超集。可能会有帮助。这看起来很有效。我实际上有两个不同的字符串(相同的格式),并希望生成一个类似“$1:$2_1,$2_2”的字符串,其中$2_是第一个和第二个字符串的伪代码。无论如何,只要稍加修改(
gensub(/(.+)\s(+)\s(+)\s(+)/,“\\1:\\2->\\4”,1,str“str2”)
),就可以实现这一点。说真的,这肯定是我得到的最快的答案。谢谢@patrik Fyi:Awk的正则表达式没有perl的强大,它是ERE的超集。可能会有帮助。
split
这里不需要第三个参数。@karakfa您能解释一下吗?在我的情况下,必须保留原始字符串。您的解决方案也可以这样做,因此最好使用se作为将来的参考。split不会损害原始字符串,但我的注意是,默认分隔符不需要指定为第三个参数。
split
第三个参数在这里不是必需的。@karakfa您能解释一下吗?在我的情况下,必须保留原始字符串。这在您的解决方案中也是可能的,因此最好为将来的引用使用se。plit不会损害原始字符串,但这里我要注意的是,默认分隔符不需要指定为第三个参数。