다음과 같은 출력이 있습니다.
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
( 에서 영감을 받아이 답변):
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
내가 보기에 유일한 단점은 규모를 축소하려면 출력을 어딘가로 파이프해야 한다는 것입니다. 그렇지 않으면 이것이 가장 깔끔한 옵션입니다. 입력 파일에 이들 중 하나가 포함될 가능성이 있는 경우 [?*
w/ boot 명령을 사용해야 합니다 set -f;
.
답변2
이 시도진주:
perl -lane 'print $F[0], "\t", "=" x ($F[1] / 5)' file
설명하다:
-a
명시적인split()
배열 이고@F
우리가 얻는 값은 다음과 같습니다.$F[n]
x
Perl에게 문자를 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 *.......................................
.
.
.