根据内容对行进行编号

根据内容对行进行编号

我想根据行的内容对行进行编号:第一行的编号为 1,第二行如果与第一行相同则编号为 2,如果不同则编号为 1,依此类推。例如:

asdf
asdf
asdf
asdf
dfg
dfg
dfg
qwert
qwert
er
qwert
er
asdf

应该导致:

1   asdf
2   asdf
3   asdf
4   asdf
1   dfg
2   dfg
3   dfg
1   qwert
2   qwert
1   er
3   qwert
2   er
5   asdf

答案1

使用 awk 更简单:-

awk '{ print ++c[$0],$0 }' < test

其中 test 是包含数据的文件。我在这里做了一些假设,但问题中并不清楚。首先,我假设文件已经排序。如果没有,那么:-

sort < test | awk '{ print ++c[$0],$0 }'

另外,我认为整行都很重要,而不仅仅是第一个单词(如果应该有多个单词)。如果您只想处理第一个单词,那么:-

awk '{ print ++c[$1],$0 }' < test

答案2

你可以这样做awk

数字.awk

BEGIN { OFS = "\t" }

last == $1 { cnt += 1}
last != $1 { cnt  = 1 }

{ print cnt, $1; last = $1 }

像这样运行:

awk -f number.awk infile

答案3

您可以迭代输入并使用计数器

#!/bin/sh                                                                                                                                                     

counter=1
old=""

while IFS= read -r line ; do
    # check if the line is different from the previous one
    if [ "$line" != "$old" ] ; then
        counter=1
    fi
    old="$line"
    printf '%s\t%s\n' "$counter" "$line"
    counter=$((counter+1))
done

您可以使用以下命令运行脚本:

$ sh scriptname.sh < inputfile

答案4

如果您需要独立于输入是否聚集(即所有出现的 X 都在彼此之后)而工作的东西,您需要为每个不同的 X 使用一些计数器。例如,您可以使用以下内容作为过滤器或与命令行参数一起使用,写入标准输出:

#!/usr/bin/env python
import sys, collections
c = collections.Counter()
for line in sys.stdin if len(sys.argv) == 1 else open(sys.argv[1]):
    c[line] += 1
    sys.stdout.write("%s\t%s" % (c[line], line))

相关内容