内容に応じて行の番号を付けたいです。最初の行は 1 に番号が付けられ、2 番目の行は最初の行と同じ場合は 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 }'
また、最初の単語(2つ以上必要な場合)だけでなく、行全体が重要だと思います。最初の単語のみを処理するには、次のようにします。
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))