gpt4 book ai didi

linux - awk 中的 tr 命令更改列值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:04 25 4
gpt4 key购买 nike

我在 awk 的 shell 脚本中使用 TR 命令来屏蔽数据。当我在 awk 中使用 tr 命令时,下面的示例文件仅影响我的文件的第一行。当我在 while 循环中使用相同的方法并在其中调用 awk 命令时,它工作正常,但需要很长时间才能完成。现在我的要求是我想在同一个文件(file.txt)中屏蔽许多列[例如:$1、$5、$9],这应该会影响整个文件而不是第一行,我想尽可能快地实现这一点以屏蔽数据。请指教

猫文件.txt
========
abcbchs,degehek
abcbchs,degehek
abcbchs,degehek
abcbchs,degehek
abcbchs,degehek
abcbchs、degehek、lskjsjshsh
abcbchs,degehek
abcbchs,degehek,lskjsjshsh

输出

awk -F"," -v OFS=","  '{ "echo \""$1"\" | tr \"a-c\" \"e-f\" | tr \"0-5\" \"6-9\"" | getline $1 }7' file.txt

effffhs,degehek
abcbchs,degehek
abcbchs,degehek
abcbchs,degehek
abcbchs,degehek
abcbchs、degehek、lskjsjshsh
abcbchs,degehek
abcbchs,degehek,lskjsjshsh

预期输出

effffhs,degehek
effffhs,degehek
effffhs,degehek
effffhs,degehek
effffhs,degehek
effffhs,degehek,lskjsjshsh
effffhs,degehek
effffhs,degehek,lskjsjshsh

最佳答案

您找到的代码在每个输入行上运行一个外部 shell 命令管道。就像您发现的那样,这是执行您所要求的事情的一种非常低效的方式。 Awk 根本不是这项任务的理想选择。也许试试 Perl。

perl -F, -lane '$F[$_] =~ tr/a-c/e-f/ =~ tr/0-5/6-9/ for (0, 4, 8); print join(",", @F)' file

-F, 选项类似于 Awk,但 Perl 不会自动拆分输入行。使用 -a 时,它会拆分成一个名为 @F 的数组,使用 -n 时,它会遍历所有输入行。 -l 可以方便地从每个输入行中删除换行符并在打印时添加一个新行。

注意列是如何从零开始编号的,而不是像 Awk 中那样从一开始编号;因此 for 循环中的索引访问 @F 的第一个、第五个和第九个元素。

关于linux - awk 中的 tr 命令更改列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29240694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com