Bash 명령 출력에서 ​​히스토그램 그리기

Bash 명령 출력에서 ​​히스토그램 그리기

다음과 같은 출력이 있습니다.

2015/1/7    8
2015/1/8    49
2015/1/9    40
2015/1/10   337
2015/1/11   11
2015/1/12   3
2015/1/13   9
2015/1/14   102
2015/1/15   62
2015/1/16   10
2015/1/17   30
2015/1/18   30
2015/1/19   1
2015/1/20   3
2015/1/21   23
2015/1/22   12
2015/1/24   6
2015/1/25   3
2015/1/27   2
2015/1/28   16
2015/1/29   1
2015/2/1    12
2015/2/2    2
2015/2/3    1
2015/2/4    10
2015/2/5    13
2015/2/6    2
2015/2/9    2
2015/2/10   25
2015/2/11   1
2015/2/12   6
2015/2/13   12
2015/2/14   2
2015/2/16   8
2015/2/17   8
2015/2/20   1
2015/2/23   1
2015/2/27   1
2015/3/2    3
2015/3/3    2

그리고 히스토그램을 그리고 싶습니다.

2015/1/7  ===
2015/1/8  ===========
2015/1/9  ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...

그렇게 할 수 있는 bash 명령이 있는지 아시나요?

답변1

안에 perl:

perl -pe 's/ (\d+)$/"="x$1/e' file
  • e표현식이 평가되므로 (와 일치하는 숫자 ) =의 값을 사용하여 반복 됩니다 .$1(\d+)
  • 더 짧은 줄을 얻는 "="x($1\/3)대신에 할 수 있습니다 . "="x$1( /대체 명령이 진행 중이므로 이스케이프됩니다.)

bash(에서 영감을 얻었습니다 .이 SO 답변):

while read d n 
do 
    printf "%s\t%${n}s\n" "$d" = | tr ' ' '=' 
done < test.txt
  • printf$n ( ) 의 너비를 얻기 위해 공백을 사용하여 두 번째 문자열을 채우고 %${n}s공백을 =.
  • 탭( \t)을 사용하여 열을 구분하지만 로 파이핑하여 더 예쁘게 만들 수 있습니다 column -ts'\t'.
  • 더 짧은 줄을 얻으려면 $((n/3))대신 사용할 수 있습니다 .${n}

다른 버전:

unset IFS; printf "%s\t%*s\n" $(sed 's/$/ =/' test.txt) | tr ' ' =

sed내가 볼 수 있는 유일한 단점은 규모를 축소하려면 의 출력을 다른 것으로 파이프해야 한다는 것입니다 . 그렇지 않으면 이것이 가장 깔끔한 옵션입니다. 입력 파일에 둘 중 하나가 포함될 가능성이 있는 경우 [?*명령을 실행해야 합니다 set -f;.

답변2

이것을 시도해보세요:

perl -lane 'print $F[0], "\t", "=" x ($F[1] / 5)' file

설명:

  • -asplit()배열 에 명시적이므로 다음을 @F사용하여 값을 얻습니다.$F[n]
  • xPerl에게 문자를 N번 인쇄하라고 지시하는 것입니다.
  • ($F[1] / 5): 여기서는 숫자를 구하고 이를 5로 나누어 예쁜 인쇄 출력을 얻습니다(간단한 산술).

답변3

쉽게awk

awk '{$2=sprintf("%-*s", $2, ""); gsub(" ", "=", $2); printf("%-10s%s\n", $1, $2)}' file

2015/1/7 ========
2015/1/8 =================================================
2015/1/9 ========================================
..
..

아니면 내가 가장 좋아하는 프로그래밍 언어로

python3 -c 'import sys
for line in sys.stdin:
  data, width = line.split()
  print("{:<10}{:=<{width}}".format(data, "", width=width))' <file

답변4

당신은술집동사밀러

$ mlr --nidx --repifs --ofs tab bar -f 2 file
2015/1/7    ***.....................................
2015/1/8    *******************.....................
2015/1/9    ****************........................
2015/1/10   ***************************************#
2015/1/11   ****....................................
2015/1/12   *.......................................
.
.
.

관련 정보