【问题标题】:how to proper do a string concatenation in awk如何在 awk 中正确地进行字符串连接
【发布时间】:2020-01-13 17:40:41
【问题描述】:

我正在尝试连接 .csv 文件中的字符串。 一个简单的示例数据文件是:

$ cat a
100, 200, 300
400, 500, 600

第一种方法一无所获。

$ awk 'BEGIN{FS=",";OFS="-"}{gsub(/ /, "");a=$1$2$3; print $a}' a

在第二种方法中,我也没有得到预期的结果。

$ awk 'BEGIN{FS=",";OFS="-"}{gsub(/ /, "");a="$1$2$3"; print $a}' a
100,200,300
400,500,600

预期结果是

100200300
400500600

如果 `.csv' 文件包含字符串而不是数字,我仍然没有得到预期的结果。中间插入了一些逗号 (,),尽管我已将输出字段分隔符设置为破折号 (-)。

$ cat b
AAA, BBB, CCC
DDD, EEE, FFF

$ awk 'BEGIN{FS=",";OFS="-"}{gsub(/ /, "");a=$1$2$3; print $a}' b
AAA,BBB,CCC
DDD,EEE,FFF

在这种情况下,预期的结果是

AAABBBCCC
DDDEEEFFF

【问题讨论】:

  • 你认为print $a 会做什么?
  • 对。里面应该没有$
  • awk -F, '{print $1""$2""$3}' file
  • @DavidC.Rankin 如果没有空间,这可以工作,所以awk -F', *' '{print $1$2$3}' 应该这样做。
  • 啊,是的。谢谢你。为未知数量的字段添加相同的多字段分隔符 awk -F', *' '{for(i=1;i<=NF;i++)printf "%s",$i; print""}' file 应该也可以。

标签: string awk concatenation


【解决方案1】:

试试这个:

awk -F', *' -v OFS= '{$1=$1}1' a
100200300
400500600

awk -F', *' -v OFS= '{$1=$1}1' b
AAABBBCCC
DDDEEEFFF

将字段分隔符设置为逗号和零个或多个空格并将输出字段分隔符设置为空,然后重新创建字段并打印它们。

或者只是删除逗号空间

awk '{gsub(/, */,"")}1' a
sed 's/, *//g' a

【讨论】:

  • 在我的最终脚本中,我想将字符串连接分配给要在其他地方使用的变量...
【解决方案2】:

这只是一个额外的$

$ awk 'BEGIN{FS=",";OFS="-"}{gsub(/ /, "");a=$1$2$3; print a}' a
100200300
400500600

【讨论】:

  • 这是错误的方法。 OFS 什么都不做,如果您要执行 gsub(),那么这就是您必须做的所有事情(但在正则表达式中包含 , )或者不执行 gsub 并将 " " 添加到 FS。请参阅@Jotne's answer 了解合理的方法。
【解决方案3】:
awk -F, '{gsub(/ /,""); print $1$2$3}' file

100200300
400500600

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多