输入文件:file.txt
P123456789,COLUMN2
P123456790,COLUMN2
P123456791,COLUMN2
预期产出:
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2
如果我尝试使用变量,它会给出正确的结果。
(i.e) /tmp>echo "P123456789"|tr "0-9" "5-9"|tr "A-Z" "X-Z"
Z678999999
但是,如果我使用awk命令,它不会给出结果而是给出错误:
/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
有人可以帮忙吗?
答案 0 :(得分:2)
在不改变逻辑的情况下做你想做的事情:
awk line:
awk -F, -v OFS="," '{ "echo \""$1"\"|tr \"0-9\" \"5-9\"|tr \"A-Z\" \"X-Z\"" |getline $1}7'
包含您的数据:
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
答案 1 :(得分:1)
$ 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
答案 2 :(得分:1)
不幸的是,AWK没有内置的翻译功能。你可以写一个像Ed Morton这样的人,但我会伸手去拿(并强烈推荐)一个更强大的工具。例如,Perl可以使用autosplit(-a
)命令开关来处理字段:
-a与-n或-p一起使用时打开自动分割模式。对@F数组的隐式拆分命令是作为内部的第一件事完成的 由-n或-p。
生成的隐式while循环
您可以输入perldoc perlrun
了解详情。
这是我的解决方案:
perl -F, -lane '$F[0] =~ tr/0-9/5-9/; $F[0] =~ tr/A-Z/X-Z/; print join (",", @F)' file.txt
结果:
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2