51197


これが元々のテキスト

[code]

    Tab
    Tab
    Tab
    Enter
    Tab
    Tab
    Tab
    Enter
    Enter
    Enter
    Tab
    Tab
    Tab
    Tab
    Tab
    Enter
    Enter
    Tab
    Tab
    Enter
    
[/code]

この結果を得たい

[code]

    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
    
[/code]

試したこと

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

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


CC BY-SA 4.0
2018-12-13T23:35:26.323
51190
2021-03-06T11:13:43.820
2018-12-15T11:27:02.580
27736
27736
question
shellscript
どのようにシェルコマンドで合計を得るか


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

[code]

    #!/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)
            }'
    
[/code]

実行結果

[code]

    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
    
[/code]


CC BY-SA 4.0
2018-12-14T00:40:36.340
51191
2018-12-14T00:40:36.340
754
51190
answer


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

[code]

    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;
    
[/code]


CC BY-SA 4.0
2018-12-14T01:04:00.117
51192
2021-03-06T11:13:43.820
2021-03-06T11:13:43.820
25936
31435
51190
answer


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

[code]

    #!/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 $?
    
[/code]


CC BY-SA 4.0
2018-12-14T03:22:27.670
51195
2018-12-14T03:22:27.670
25936
51190
answer

[code]

    $ uniq -c original.txt | sed 's/^ *\([[:digit:]]\+\) \(.*\)/\2 \1/'
    
[/code]


CC BY-SA 4.0
2018-12-14T03:56:50.133
51197
2018-12-14T03:56:50.133
4010
51190
answer


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

[code]

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


CC BY-SA 4.0
2018-12-14T04:05:34.530
51198
2018-12-14T04:05:34.530
51190
answer