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

如何在unix中使用awk with tr命令转换文件中的列值 细节:,awk,Awk,输入文件: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命令,它不会给出结

输入文件: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

有人能帮忙吗?

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

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

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

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

不幸的是,AWK没有内置的翻译功能。你可以像以前一样写一篇文章,但我会寻求(并强烈推荐)一个更强大的工具。例如,Perl可以使用autosplit(
-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

不幸的是,AWK没有内置的翻译功能。你可以像以前一样写一篇文章,但我会寻求(并强烈推荐)一个更强大的工具。例如,Perl可以使用autosplit(
-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


awk不是shell,就像C不是shell一样。您不能从awk程序调用shell命令,就像不能从C程序调用一样。请检查此链接:。您还可以查找
getline
answers(参见Kent的答案),或者学习足够的awk来完全操作awk中的数据。awk不是shell,就像C不是shell一样。您不能从awk程序调用shell命令,就像不能从C程序调用一样。请检查此链接:。您还可以查找
getline
answers(参见Kent的答案),或者学习足够的awk来完全操作awk中的数据。它仍然给出错误:/tmp>$cat aml\u test.txt | awk-F,-v of s=“,”,“{”echo\$1“\”tr\'0-9\”5-9\”tr\'A-Z\'X-Z\”;getline$1}7'sh:-c:第0行:查找匹配时出现意外EOF`“'sh:-c:第1行:语法错误:文件P123456789的意外结尾,第2列P123456790,第2列P123456791,第2列请在我的回答中使用相同的命令,查看是否有效。”。不知道你的数据是什么样子的@穆拉里+1,但最后神秘的
7
是什么?只需一个非零整数就可以创建一个始终为真的模式,从而打印当前行?您是否打算使用
1
?@mklement0是。但是按7比按1更容易,你能帮我吗?当我使用与上面给出的相同的命令运行您的命令时,我得到了错误它仍然给出了错误:/tmp>$cat aml\u test.txt | awk-F,-v OFS=“,”{“echo\”$1“\”;tr\“0-9\”5-9\“;tr\“A-Z\”X-Z\”;getline$1}7'sh:-c:0行:在寻找匹配时出现意外的EOF`“'sh:-c:第1行:语法错误:文件P123456789的意外结尾,第2列P123456790,第2列P123456791,第2列请在我的回答中使用相同的命令,查看是否有效。”。不知道你的数据是什么样子的@穆拉里+1,但最后神秘的
7
是什么?只需一个非零整数就可以创建一个始终为真的模式,从而打印当前行?您是否打算使用
1
?@mklement0是。但是按7比按1更容易,你能帮我吗?当我用上面给出的命令运行你的命令时,我收到了错误。谢谢史蒂夫!!!精彩的。我发现awk是以C程序运行的,因此它不允许使用unix命令,所以我尝试使用system命令来完成它为我工作的翻译部分。但我相信我的方法需要处理时间,而我将采用您的方法。下面的方法我们可以遵循,但取决于我们应选择的方法的处理速度。>/tmp>$awk'BEGIN{FS=OFS=“,”}{$1=system(“echo”$1“| tr'0-9''5-9'| tr'A-Z''X-Z'”;$2=“COLUMN2”}'/tmp/file.txt>结果:====Z678999999 Z678999995Z678999996@Murali:
system()
返回命令的退出代码,而不是其标准输出;请参阅@Kent的答案,该答案用于使用
getline
在变量中捕获shell命令输出@Murali:如果您有时间,我很想看看这三个答案的基准。我敢打赌Perl是最慢的,但差别可能微不足道。谢谢Steve!!!精彩的。我发现awk是以C程序运行的,因此它不允许使用unix命令,所以我尝试使用system命令来完成它为我工作的翻译部分。但我相信我的方法需要处理时间,而我将采用您的方法。下面的方法我们可以遵循,但取决于我们应选择的方法的处理速度。>/tmp>$awk'BEGIN{FS=OFS=“,”}{$1=system(“echo”$1“| tr'0-9''5-9'| tr'A-Z''X-Z'”;$2=“COLUMN2”}'/tmp/file.txt>结果:====Z678999999 Z678999995Z678999996@Murali:
system()
返回命令的退出代码,而不是其标准输出;请参阅@Kent的答案,该答案用于使用
getline
在变量中捕获shell命令输出@Murali:如果您有时间,我很想看看这三个答案的基准。我敢打赌Perl是最慢的,但差别可能微不足道。