我有一个带有列的制表符分隔文件,如下所示:
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执行此操作。提前谢谢。
答案 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