2

我有一个文件,其中第一列有一个家庭标识符列表

AB
AB
AB
AB
SAR
SAR
EAR

有没有一种方法可以创建一个新列,其中每个重复都被编号,为每个重复创建一个新标签,即

AB_1
AB_2
AB_3
AB_4
SAR_1
SAR_2
EAR_1

我可以在 SAS 中执行此操作,但正在寻找 bash 选项(可能是 awk)

data file;
set file; 
count+1;
by name;
if first.name then count=1;
new_name=compress(name||'_'||count);
run;
4

2 回答 2

4
$ awk '{print $1"_"++a[$1]}' file
AB_1
AB_2
AB_3
AB_4
SAR_1
SAR_2
EAR_1
于 2013-03-25T15:56:57.070 回答
2

试试这个单行:

awk '{a[$0]++;print $0"_"a[$0]}' file

使用您的输入数据:

kent$ echo "AB
AB
AB
AB
SAR
SAR
EAR"|awk '{a[$0]++;print $0"_"a[$0]}'
AB_1
AB_2
AB_3
AB_4
SAR_1
SAR_2
EAR_1
于 2013-03-25T15:57:17.570 回答