我想将两列中的字母转换为数字。
在下面的示例中,我想将第 2 列和第 3 列中的字母更改为数字,因此A
更改为1
、B
into 2
、C
into3
和G
into 4
。
第一列还可能包含字母A
、B
和C
。G
这些应该不是被改变。
/
列由( )分隔<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
将列切成两组,一组包含第一列,另一组包含第二列和第三列。
将第二组中的字符音译为数字。
再次将所有内容粘贴在一起。
在命令行上:
$ 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