首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在unix中使用awk with tr命令转换文件中的列值

如何在unix中使用awk with tr命令转换文件中的列值
EN

Stack Overflow用户
提问于 2014-02-14 06:05:58
回答 3查看 3.5K关注 0票数 0

详细信息:

输入文件: file.txt

代码语言:javascript
运行
复制
P123456789,COLUMN2
P123456790,COLUMN2
P123456791,COLUMN2

预期输出:

代码语言:javascript
运行
复制
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2

如果我尝试使用一个变量,它会给出正确的结果。

代码语言:javascript
运行
复制
(i.e) /tmp>echo "P123456789"|tr "0-9" "5-9"|tr "A-Z" "X-Z"
Z678999999

但是如果我使用awk命令,它不会给出结果,而是给出错误:

代码语言:javascript
运行
复制
/tmp>$ awk 'BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }' /tmp/file.txt >/tmp/file.txt.tmp
awk: BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }
awk:                                   ^ syntax error
awk: BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }
awk:                                                  ^ syntax error
awk: BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }
awk:                                                                             ^ syntax error

有谁能帮帮忙吗?

EN

回答 3

Stack Overflow用户

发布于 2014-02-14 06:18:22

只要做你想做的,不要改变你的逻辑:

awk行:

代码语言:javascript
运行
复制
awk -F, -v OFS="," '{ "echo \""$1"\"|tr \"0-9\" \"5-9\"|tr \"A-Z\" \"X-Z\"" |getline $1}7'

使用您的数据:

代码语言:javascript
运行
复制
kent$  echo "P123456789,COLUMN2
P123456790,COLUMN2
P123456791,COLUMN2"|awk -F, -v OFS="," '{ "echo \""$1"\"|tr \"0-9\" \"5-9\"|tr \"A-Z\" \"X-Z\"" |getline $1}7'                                                              
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2
票数 2
EN

Stack Overflow用户

发布于 2014-02-14 06:45:24

代码语言:javascript
运行
复制
$ cat tst.awk
function tr(old,new,str,        oldA,newA,strA,i,j) {
    split(old,oldA,"")
    split(new,newA,"")
    split(str,strA,"")
    str = ""
    for (i=1;i in strA;i++) {
        for (j=1;(j in oldA) && !sub(oldA[j],newA[j],strA[i]);j++)
            ;
        str = str strA[i]
    }
    return str
}

BEGIN { FS=OFS="," }
{ print tr("P012345678","Z567899999",$1), $2 }

$ awk -f tst.awk file
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2
票数 1
EN

Stack Overflow用户

发布于 2014-02-14 09:38:20

不幸的是,AWK没有内置的翻译功能。您可以像Ed Morton那样编写一个,但我会选择(并强烈推荐)一个更强大的工具。例如,Perl可以使用自动拆分(-a)命令开关来处理字段:

当与-n或-p一起使用时,

-a将打开自动拆分模式。对@F数组执行隐式拆分命令是作为-n或-p生成的隐式while循环中的第一件事。

您可以键入perldoc perlrun以获取更多详细信息。

这是我的解决方案:

代码语言:javascript
运行
复制
perl -F, -lane '$F[0] =~ tr/0-9/5-9/; $F[0] =~ tr/A-Z/X-Z/; print join (",", @F)' file.txt

结果:

代码语言:javascript
运行
复制
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21766541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档