将列中的字母转换为数字

将列中的字母转换为数字

我想将两列中的字母转换为数字。

在下面的示例中,我想将第 2 列和第 3 列中的字母更改为数字,因此A更改为1Binto 2Cinto3Ginto 4

第一列还可能包含字母ABCG这些应该不是被改变。

/列由( )分隔<space><slash><space>

Id_animal / Column1 / Column2
ID01 / A / B
ID02 / B / A
ID03 / C / A
ID04 / A / G

想要的输出是:

Id_animal / Column1 / Column2
ID01 / 1 / 2
ID02 / 2 / 1
ID03 / 3 / 1
ID04 / 1 / 4

答案1

  1. 将列切成两组,一组包含第一列,另一组包含第二列和第三列。

  2. 将第二组中的字符音译为数字。

  3. 再次将所有内容粘贴在一起。

在命令行上:

$ cat data
Id_animal / Column1 / Column2
ID01 / A / B
ID02 / B / A
ID03 / C / A
ID04 / A / G
ABCG / G / G

$ paste -d '/' <(cut -d '/' -f 1 data) <(cut -d '/' -f 2,3 data | tr 'ABCG' '1234')
Id_animal / 3olumn1 / 3olumn2
ID01 / 1 / 2
ID02 / 2 / 1
ID03 / 3 / 1
ID04 / 1 / 4
ABCG / 4 / 4

您会在标题中获得奖励数字...:-)

答案2

假设您只想将 A、B、C 和 G 转换为 1、2、3 和 4,并且第一列从不包含这些字母,您可以将 bgStack15 的答案简化为:

tr 'ABCG' '1234' < input > output

答案3

根据需要调整变量。将其保存到文件中,例如`/home/Amanda/script.sh

#!/bin/sh
infile=~/input.txt
outfile=~/output.txt
while read one two; do
   printf "%s %s\n" "${one}" "$( echo "${two}" | tr 'ABCG' '1234' )"
done < ${infile} > ${outfile}

确保使脚本可执行:chmod +x /home/Amanda/script.sh

答案4

perl可以使用map例如将音译应用到特定的输入列

perl -F"/" -alne 'print join "/", @F[0], map { tr/ABCG/1234/; $_ } @F[1,2]' input

例如,给定输入

Id_animal / Column1 / Column2
ID01 / A / B
ID02 / B / A
AG02 / B / A
ID03 / C / A
ID04 / A / G

然后

$ perl -F"/" -alne 'print $. == 1? $_ : join "/", @F[0], map { tr/ABCG/1234/; $_ } @F[1,2]' input
Id_animal / Column1 / Column2
ID01 / 1 / 2
ID02 / 2 / 1
AG02 / 2 / 1
ID03 / 3 / 1
ID04 / 1 / 4

相关内容