【问题标题】:Awk: Cannot concatenate stringsawk:无法连接字符串
【发布时间】:2013-08-08 04:09:20
【问题描述】:

我目前正在处理 AWK,我使用了三个变量:

  • $0 变量 - 对于本例,它相当于:

path/filename.cpp LOG_ERR << "error in this log" << e.what();

  • $logName变量——我解析出cpp文件的名字,即:

filename

  • $2 变量 - 包含默认的第二个值:

LOG_ERR

问题:

我想做的是像这样连接值:

logName=$logName $2;

但我得到的不是预期值filenameLOG_ERR,而是:

filename LOG_ERR << "error in this log" << e.what();

我做错了什么?

编辑:按要求编写 AWK 代码:

awk '{
logName=sub(/^.*\//,"",$1);
logName=sub(/\..*:/,"",$logName);

print $logName;
print $2;

logName=$logName $2;

print $logName;
}' $file

EDIT2:已修复。不要在 awk 中调用任何 $ 变量,除非它是一个字段编号。 :)

awk '{
logName=$1;
sub(/^.*\//,"",logName);
sub(/\..*:/,"",logName);
print logName;
logName=logName $2;
print logName;
}' $file

【问题讨论】:

  • 向我们展示您的 awk 代码

标签: linux awk concatenation


【解决方案1】:
logName=$logName $2;

这段代码是错误的。

你使用了$logName,表示列索引logName,显然不是你想要的。

如果logName 的值是字符串filename,awk 将在此处尝试获取列 $filename,如果未定义/分配变量,并且您尝试将其作为数字获取,则awk 将获取0 .你可以测试一下:

kent$ echo "xxxx y y"|awk '{print $foo}'
xxxx y y

所以我想,解决方法是:(如果 logName 设置正确,如你所说)

logName=logName $2;

编辑

你不应该打电话给$logName检查这个例子:

kent$echo "111 222"|awk -v logName="filename" '{logName=logName $2;print logName}'                                                                             
filename222

【讨论】:

  • 不正确。在logName=logName $2; 之后对 $logName 调用 print 只会打印出 filename。 ://
  • @S.T.A.L.K.E.R.如果我是你,我会这样得到字符串:awk -F'\\.cpp |/| ' '{print $2$3}'
  • 行不通,我上面提到的 $0 格式有大约 20 行。不过还是谢谢!
  • @S.T.A.L.K.E.R. 20 或 2k 行根本不是问题。无论如何,我希望您理解代码中的问题。您的代码中应该有 NO $logName。祝你好运。
最近更新 更多