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