用数字替换列的字母字符

时间:2017-12-28 20:52:14

标签: bash shell awk

如何用数字替换列的字母字符?我有一个文件,如:

1  A 005
2  A 007
3  A 009
4  C 005
5  C 007
6  C 009
7  P 005
8  P 007
9  P 009 
10 S 010
11 S 010
12 T 020

我想用数字替换第二列,以便将所有 A 替换为1;所有 C s替换为2,所有 P s替换为3;和下一个数字的下一个字符。所需的输出是:

1  1 005
2  1 007
3  1 009
4  2 005
5  2 007
6  2 009
7  3 005
8  3 007
9  3 009 
10 4 010
11 4 010
12 5 020

2 个答案:

答案 0 :(得分:1)

解决方案1: 如果您的Input_file与显示的示例相同(按第2列排序),您也可以尝试关注awk

awk 'prev!=$2{count++} {prev=$2;$2=count;print}'  Input_file

解决方案第二: 如果您的Input_file未排序,那么我首先对其进行排序,然后使用上面的解决方案1st awk命令来获取输出。

sort -k2 Input_file | awk 'prev!=$2{count++} {prev=$2;$2=count;print}'

答案 1 :(得分:0)

awk '!num[$2]{num[$2]=++c} {$2=num[$2]}1' file
  • 第一个condition{action}表示:如果第二个字段是新手,则为该字母键存储自动增量整数值。对于您的示例num['A']=1,依此类推。请注意,未初始化的变量c, 从零开始,这意味着++c首先是1,然后是2,依此类推。

  • 第二个{action}表示:使用该字段作为键,将第二个字段替换为上一个关联数组中的值。

  • 最终1表示默认操作,打印行,与printprint $0

  • 相同