详细信息:
输入文件: 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
有谁能帮帮忙吗?
发布于 2014-02-14 06:18:22
只要做你想做的,不要改变你的逻辑:
awk行:
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
发布于 2014-02-14 06:45:24
$ 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
发布于 2014-02-14 09:38:20
不幸的是,AWK没有内置的翻译功能。您可以像Ed Morton那样编写一个,但我会选择(并强烈推荐)一个更强大的工具。例如,Perl可以使用自动拆分(-a
)命令开关来处理字段:
当与-n或-p一起使用时,
-a将打开自动拆分模式。对@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
https://stackoverflow.com/questions/21766541
复制相似问题