使用awk或gsub替换列中的特定模式

时间:2014-11-12 21:17:46

标签: awk gsub

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

 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执行此操作。提前谢谢。

2 个答案:

答案 0 :(得分:0)

sed怎么样?

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

不可否认,这很明智地假设这些字符序列不会出现在第3列以外的任何地方,但如果这是允许的话,上面的内容应该适合你。

答案 1 :(得分:0)

$ 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 for 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