【问题标题】:AWK command to separate line using Field-sperator使用字段分隔符分隔行的 AWK 命令
【发布时间】:2014-09-04 15:19:38
【问题描述】:
 Info 750: local macro 'ADD_GEN_METHOD' (line 149, file /home/vya3kor/vmshare/vya3kor_rbin_g3g_tas_lcmccatestadapter.vws/di_cfc/components/spm/LcmProject/framework/cca/server/generic/spm_CcaServiceHandlerFiParamConfig.cpp) not referenced

我想使用带有字段分隔符 (line 的 awk 来分隔上面的行

我使用了这个命令,但它不起作用

$ grep Info.* 1.txt |awk -F "(line" '{print $1}'
error : awk: fatal: Unmatched ( or \(: /(line/

我想要的输出:

/di_cfc/components/spm/LcmProject/framework/cca/server/generic/spm_CcaServiceHandlerFiParamConfig.cpp%149%Info 750%local macro 'ADD_GEN_METHOD'%

所以我使用了这个命令:

$ grep  '^[Ii]nfo.*:'|
awk -F ":" '{print $1"%" $2}'| 
awk -F ", file.*.vws" '{print $1"%" $2 }'| 
awk -F ") not referenced" '{print $1"%" }'|
awk -F '(' '{print $1"%" $2"%" $3}'|
awk -F "line" '{print $1 $2 $3 }' | 
awk -F "%" '{print $1$ "\n2" $3 $4 $4 $5}'

【问题讨论】:

  • 您希望该输入行的输出是什么?
  • 这根本没有帮助。更新帖子。
  • @user2713375 停止在 cmets 中发布代码,并使用此信息编辑问题。
  • 仍然完全没有帮助。评论无法进行有意义的格式化。使用数据编辑您的帖子,以便您可以合理地格式化它。
  • 我编辑了你的问题以格式化它。您完全错过了使用 awk 的意义,并且错误消息准确地告诉您您的具体问题是什么。获取 Arnold Robbins 的《Effective Awk Programming, 第三版》一书。

标签: bash shell awk


【解决方案1】:

你可以使用这个 awk:

awk -F '\\(line' '{print $1}'
Info 750: local macro ADD_GEN_METHOD

( 是需要转义的特殊正则表达式符号。

【讨论】:

  • 引号很重要。单人与双人。
  • @EtanReisner 用于双引号 awk -F "\\\(line" '{print $1}'。所以我想说[(] 是一个更好的解决方案,因为单引号和双引号都是一样的。
【解决方案2】:

您可以这样做,而不是转义(

awk -F'[(]line' '... your codes'

我个人认为它更容易阅读。

【讨论】:

    【解决方案3】:

    如果字段分隔符是通过-v 设置的,则需要使用三个反斜杠,

    $ echo 'Info 750: local macro 'ADD_GEN_METHOD' (line 149, file /home/vya3kor/vmshare/vya3kor_rbin_g3g_tas_lcmccatestadapter.vws/di_cfc/components/spm/LcmProject/framework/cca/server/generic/spm_CcaServiceHandlerFiParamConfig.cpp) not referenced' | awk -v FS="\\\(line" '{print $1}'
    Info 750: local macro ADD_GEN_METHOD 
    

    【讨论】:

      【解决方案4】:

      有了这么多切碎,sed 可能会更好:

      sed -n '/^[Ii]nfo/s/\(Info.*\): \([^(]*\).*file \([^)]*)\) .*/\3%\1%\2/gp' 1.txt
      

      【讨论】:

        【解决方案5】:
        $ cat file
        Info 750: local macro 'ADD_GEN_METHOD' (line 149, file /home/vya3kor/vmshare/vya3kor_rbin_g3g_tas_lcmccatestadapter.vws/di_cfc/components/spm/LcmProject/framework/cca/server/generic/spm_CcaServiceHandlerFiParamConfig.cpp) not referenced
        $
        $ cat tst.awk
        BEGIN{ FS=" *[()] *"; OFS="%" }
        /^[Ii]nfo.*:/ {
            split($2,a,/[ ,]+/)
            sub(/: /,OFS,$1)
            sub(/.*\.vws/,"",$2)
            print $2, a[2], $1 OFS
        }
        $
        $ awk -f tst.awk file
        /di_cfc/components/spm/LcmProject/framework/cca/server/generic/spm_CcaServiceHandlerFiParamConfig.cpp%149%Info 750%local macro 'ADD_GEN_METHOD'%
        $
        

        或者您可以在 GNU awk 中通过一次 gensub() 调用来完成所有操作,或者只使用 sed 作为 @chthonicdaemon 建议的,因为这只是单行上的简单替换。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-28
          • 2020-12-02
          • 1970-01-01
          • 1970-01-01
          • 2014-10-14
          • 1970-01-01
          相关资源
          最近更新 更多