我想根据行的内容对行进行编号:第一行的编号为 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))