gpt4 book ai didi

perl - 基于文本代码的 awk/Perl/Sed 列替换

转载 作者:行者123 更新时间:2023-12-01 05:37:34 25 4
gpt4 key购买 nike

我有一个包含以下内容的文本文件

L,4m,06/03/2013
L,33GJm,06/03/2013,G
L,44Bm,06/03/2013,B
L,4q,08/03/2013
J,4m,04/03/2013
J,3GU,04/03/2013,G
J,3jm,04/03/2013
J,3GJ,04/03/2013,G
J,44Bm,06/03/2013,B
J,34Bq,08/03/2013,B
M,4v,12/03/2013
D,3GU,12/03/2013,G
D,4B,11/03/2013,B
D,4m,12/03/2013
D,3GJ,13/03/2013,G
D,3GU,13/03/2013,G
D,4B,14/03/2013,B
D,4B,14/03/2013,B
D,34Bm,14/03/2013,B
L,33BUq,11/03/2013,B
L,3BJUq,11/03/2013,B
L,44Bq,14/03/2013,B
L,44Bq,14/03/2013,B
L,3Bq,15/03/2013,B
L,3q,15/03/2013
J,34Bjq,11/03/2013,B
J,33GUm,12/03/2013,G
J,4q,13/03/2013
J,33GUq,13/03/2013,G
J,33GUq,13/03/2013,G
J,4q,13/03/2013
M,3BU,18/03/2013,B
M,4B,18/03/2013,B
M,4B,18/03/2013,B
M,3GJ,19/03/2013,G
M,3GJ,19/03/2013,G
D,4B,22/03/2013,B
D,3BU,22/03/2013,B
L,34Bv,18/03/2013,B
L,3jm,19/03/2013
L,4m,19/03/2013
L,33GJm,19/03/2013,G
L,33GUm,19/03/2013,G
J,33BUm,18/03/2013,B
J,4m,18/03/2013
J,4B,18/03/2013,B
J,33BUm,18/03/2013,B
J,4q,22/03/2013
J,4q,22/03/2013
A,3GJ,28/03/2013,G
M,4B,27/03/2013,B
D,4B,25/03/2013,B
L,44Bq,25/03/2013,B
L,34Bq,25/03/2013,B
L,34Bq,25/03/2013,B
L,33BUa,26/03/2013,B
L,33BUq,26/03/2013,B
L,33BUq,26/03/2013,B
L,34Bq,27/03/2013,B
L,34Bq,27/03/2013,B
L,4B,27/03/2013,B
L,34Bq,27/03/2013,B
L,4a,28/03/2013

我想根据以下编码系统翻译第二列。

如果 $2 以 1 或 2 开头 - 将 $2 更改为优秀
如果 $2 包含 3BU 或 3GU - 将 $2 更改为 Good
如果 $2 包含 3BJ 或 3GJ - 将 $2 更改为 OK
如果 $2 以 4 开头 - 将 $2 改为Poor
如果 $2 以 5 开头 - 更改 $2 可怕

我可以使用以下命令轻松找到并将 3BU 更改为 Good
awk 'BEGIN{FS=",";OFS=","} {if ($2~ /3(B|G)U/)print $1,"Good",$3}' file | sponge file

虽然我使用所有其他非 3(B|G)U 线。我可以使用 if else 术语,尽管这看起来不雅。我尝试使用 gensub 来解决问题
awk -F, '{gensub(/3(B|G)U/,Good,"",2)}1' file

但这会在没有替换的情况下打印文件内容。任何提示

期望输出
L,Poor,06/03/2013
L,Ok,06/03/2013,G
L,Poor,06/03/2013,B
L,Poor,08/03/2013
J,Poor,04/03/2013
J,Good,04/03/2013,G

perl 或 sed 单行代码也很有帮助,因为此代码构成了 bash shell 脚本的一部分

最佳答案

如果你想坚持使用 shell:

(
IFS=,
while read -ra f; do # pick more appropriate variable names
case ${f[1]} in
[12]*) f[1]=Excellent ;;
*3[BG]U*) f[1]=Good ;;
*3[BG]J*) f[1]=OK ;;
4*) f[1]=Poor ;;
5*) f[1]=Terrible ;;
esac
echo "${f[*]}"
done < file
) > tmp && mv tmp file

我在子 shell 中运行它以本地化对 $IFS 的更改

关于perl - 基于文本代码的 awk/Perl/Sed 列替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16608955/

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