更改特定列中的字母范围

时间:2016-05-31 11:00:08

标签: bash awk

我想在第11栏中更改这些字符

!"#$%&'()*+,-.\/0123456789:;<=>?@ABCDEFGHIJ

对于这些行为者:

@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghi

所以,如果我在第11列000@!中,它应该是PPP_@。我试过awk

awk '{a = gensub(/[@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghi]/, /[!\"\#$%&'\''()*+,-.\/0123456789:;<=>?@ABCDEFGHIJ]/, "g", $11); print a }' file.txt

但它不起作用......

2 个答案:

答案 0 :(得分:3)

尝试Perl。

perl -lane '$F[10] =~ y/!"#$%&'"'"'()*+,-.\/0-9:;<=>?@A-J/@A-Z[\\]^_`a-i/;
    print join(" ", @F)'

我在&#34;第11栏&#34;你的意思是在第十次连续空格之后的几个字符的字符串,这是-a选项默认分割的内容(基本上是为了模拟Awk)。遗憾的是,对数组@F的更改不会直接显示在输出中,因此您必须从(修改的)@F重建输出行,这会将字段分隔符规范化为单个空格

答案 1 :(得分:2)

只需将f = 2更改为f = 11

$ cat tst.awk
BEGIN {
    f = 2
    old = "!\"#$%&'()*+,-.\\/0123456789:;<=>?@ABCDEFGHIJ"
    new = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghi"
    n = length(old)
    for (i=1; i<=n; i++) {
        map[substr(old,i,1)] = substr(new,i,1)
    }
}
{
    n = length($f)
    newStr = ""
    for (i=1; i<=n; i++) {
        oldChar = substr($f,i,1)
        newStr = newStr (oldChar in map ? map[oldChar] : oldChar)
    }
    $f = newStr
    print
}

$ cat file
a 000@! b

$ awk -f tst.awk file
a PPP_@ b

请注意,您必须在字符串中转义"\