【问题标题】:replace a specific pattern in a column using awk or gsub使用 awk 或 gsub 替换列中的特定模式
【发布时间】:2014-11-12 21:17:45
【问题描述】:

我有一个制表符分隔的文件,其列如下所示:

 1   2   3    Score\x3e366\x3bName\x3elod\x3e41
 3   5   6    Score\x3e366\x3bName\x3elod\x3e41

我需要将 '\x3e' 替换为 '=' 和 '\x3b' 替换为 ';'在第 4 列。输出应如下所示:

 1   2   3    Score=366;Name=lod=41
 3   5   6    Score=366;Name=lod=41

有人可以帮助使用 awk/gsub 来执行此操作。提前致谢。

【问题讨论】:

    标签: awk gsub


    【解决方案1】:

    sed怎么样?

    more file.txt | sed -e s/\\\\x3e/=/g | sed -e s/\\\\x3b/\;/g
    

    诚然,这很愉快地假设这些字符序列不会出现在第三列之外的任何地方,但如果允许,上述内容应该适合您。

    【讨论】:

    • 非常感谢。它工作正常,但我一直在想,如果这种模式存在于其他地方,是否可以限制到特定列?
    • 你为什么moreing文件?
    • @Jidder 你能推荐一个更好的方法吗?
    • 您好,在 python 脚本中使用此命令时,这似乎不起作用。输出保持不变。有什么问题的线索吗?
    【解决方案2】:
    $ awk '{col=$4; gsub(/\\x3e/,"=",col); gsub(/\\x3b/,";",col); sub(/[^[:space:]]+$/,col)} 1' file
     1   2   3    Score=366;Name=lod=41
     3   5   6    Score=366;Name=lod=41
    

    需要替换的列不是该行的最后一列的一般情况:

    $ cat file
     1   2   3    Score\x3e366\x3bName\x3elod\x3e41    foo
     3   5   6    Score\x3e366\x3bName\x3elod\x3e41    bar
    

    是这样吗(使用 GNU awk 进行 gensub() 并为了便于阅读而分成单独的行):

    $ awk -v n=4 '{
        col = $n
        gsub(/\\x3e/,"=",col)
        gsub(/\\x3b/,";",col)
        print gensub("(\\s*)((\\S+\\s+){"n-1"})\\S+(.*)","\\1\\2" col "\\4","")
    }' file
     1   2   3    Score=366;Name=lod=41    foo
     3   5   6    Score=366;Name=lod=41    bar
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2013-11-11
      • 2014-03-27
      相关资源
      最近更新 更多