使用唯一标识符替换列表中的重复元素

Jon*_*oni 2 bash replace rename sed

我有一个如下列表:

1 . Fred 1 6 78 8 09
1 1 Geni 1 4 68 9 34
2 . Sam 3 4 56 6 89
3 . Flit 2 4 56 8 34
3 4 Dog 2 5 67 8 78
3 . Pig 2 5 67 2 21
Run Code Online (Sandbox Code Playgroud)

(实际列表除外是4000万行).

第二列中有重复的元素(即".")

我想用独特的标识符替换它们(例如".1",".2",".3"......".n ")

我尝试用bash循环/ sed组合来做这个,但它不起作用......

尝试失败:

for i in 1..4
  do
    sed -i "s_//._//."$i"_"$i""
  done 
Run Code Online (Sandbox Code Playgroud)

(从本质上讲,我一直想把你sed将替换每个ñ日""和" ñ ",但这并没有工作).

Mat*_*Mat 5

这是一种方法awk(假设您的文件被调用input:

$ awk '$2=="."{$2="."++counter}{print}' input 
1 .1 Fred 1 6 78 8 09
1 1 Geni 1 4 68 9 34
2 .2 Sam 3 4 56 6 89
3 .3 Flit 2 4 56 8 34
3 4 Dog 2 5 67 8 78
3 .4 Pig 2 5 67 2 21
Run Code Online (Sandbox Code Playgroud)

awk程序将第二列($2)替换为通过连接形成的字符串.和预先递增的计数器(++counter),如果第二列是完全匹配的话..然后打印出它得到的所有列($2修改与否)({print}).

普通bash替代方案:

c=1
while read -r a b line ; do
  if [ "$b" == "." ] ; then
    echo "$a ."$((c++))" $line"
  else
    echo "$a $b $line"
  fi
done < input
Run Code Online (Sandbox Code Playgroud)