2

これが元々のテキスト

Tab
Tab
Tab
Enter
Tab
Tab
Tab
Enter
Enter
Enter
Tab
Tab
Tab
Tab
Tab
Enter
Enter
Tab
Tab
Enter

この結果を得たい

Tab 1
Tab 2
Tab 3
Enter 1
Tab 1
Tab 2
Tab 3
Enter 1
Enter 2
Enter 3
Tab 1
Tab 2
Tab 3
Tab 4
Tab 5
Enter 1
Enter 2
Tab 1
Tab 2
Enter 1

試したこと

cat original.txt|sort -n |uniq -c

だけどこれは欲しい結果ではない。お助けください。

taroyanaka
  • 31
  • 6

5 Answers5

6

簡単な文字列と数値に関する計算は、 awk を用いるのが良いと思います。

#!/bin/sh

lines() {
    cat <<EOF
Tab
Tab
Tab
Enter
Tab
Tab
Tab
Enter
Tab
Tab
Tab
Tab
Tab
Enter
Tab
Tab
Enter
EOF
}

lines |
    awk '
        {
            if (current == $0){
                count += 1
            } else {
                current = $0
                count = 1
            }
            print(current " " count)
        }'

実行結果

Tab 1
Tab 2
Tab 3
Enter 1
Tab 1
Tab 2
Tab 3
Enter 1
Tab 1
Tab 2
Tab 3
Tab 4
Tab 5
Enter 1
Tab 1
Tab 2
Enter 1
Yuki Inoue
  • 16,805
  • 19
  • 80
  • 196
5

awk を使うのでしたら以下の様な方法でもよろしいかと思います。

awk '$1!=prev{prev=$1;NR=1}{print $1,NR}' original.txt
1

こういうシェルスクリプトでも実現できます。

#!/bin/sh
set -Cu
#set -vx # Uncomment for debugging

while read -r line; do
    if test "${prev:=$line}" = "$line"; then
        count=$((${count:=0}+1))
    else
        count=1
        prev="$line"
    fi

    printf "%s %d\\n" "$line" "$count"
done < original.txt

exit $?
伽語蓮弥
  • 1,482
  • 1
  • 8
  • 20
0

繰り返し入力されている行の数を付加するということで考えました。
結果サンプルの9、10、17行目のEnterは出力されません。
bashを使っています。

cat original.txt | uniq -c | while read -r -a line; do; for i in `seq 1 ${line[0]}`;do; echo ${line[1]} ${i}; done; done;
伽語蓮弥
  • 1,482
  • 1
  • 8
  • 20
bf109
  • 1
  • while readの代わりにxargsを使うと若干短くできました。uniq -c original.txt | xargs -I@ sh -c 'for i in $(seq ${1% *}); do printf "%s %d\\n" "${1#* }" "$i"; done' _ @ – 伽語蓮弥 Dec 14 '18 at 23:41
0
$ uniq -c original.txt | sed 's/^ *\([[:digit:]]\+\) \(.*\)/\2 \1/'
emasaka
  • 2,868
  • 11
  • 11