たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

シェル芸160ノック12

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題57

$ cat qdata/57/table.md | sd '\|' ' | ' | column -t | sd ' ?\| ?' '|'
| AAA   | BBB | CCC |
| ---   | --- | --- |
| 1     | 123 | 4   |
| 10000 | 1   | 64  |
| 3     | 3   | 3   |

pandoc解は楽でいいのでpandocも使っていきます

問題58

$ cat qdata/58/num.csv | teip -og '"([\d]+,?)+"' -- sd ',' '' | tr -d \" | tr , + | paste -sd + | bc
1235362.19999999999999999999999

teipは便利だなあ

問題59

$ cat qdata/59/data.csv| awk '{print NR","$0}' |rb -l 'require "csv";a=CSV.parse(self)[0];if(a.length == 3) then pp a; end' | grep "\[" | tr -d '\[\]\\'
"4", "もう,",", "いや,",や"

ruby芸も覚えたいね

問題60

$ dateutils.dseq --format "%Y-%m %d" 2017-02-24 7d 2017-12-31 | awk '{a[$1]=$2}END{for(k in a) print k"-"a[k]}' | sort
2017-02-24
2017-03-31
2017-04-28
2017-05-26
2017-06-30
2017-07-28
2017-08-25
2017-09-29
2017-10-27
2017-11-24
2017-12-29

問題61

$ dateutils.dseq --format "%Y-%m-%d" "$(date -d $((1+$(date +%w))) +%F)" -1d $(date -d "$((7+$(date +%w))) day ago" +%F) | grep -f- <(exa --time-style=long-iso -l|sel 4:)
2021-11-28 00:00 2021-11-28_00:00:00
2021-11-28 01:00 2021-11-28_01:00:00
2021-11-28 02:00 2021-11-28_02:00:00
2021-11-28 03:00 2021-11-28_03:00:00
2021-11-28 04:00 2021-11-28_04:00:00
2021-11-28 05:00 2021-11-28_05:00:00
2021-11-28 06:00 2021-11-28_06:00:00
...

問題62

$ uconv -f sjis qdata/62/syukujitsu.csv | awk -F'[/,]' '/2019/,0{printf "%d/%02d/%02d %s\n",$1,$2,$3,$4}'  | join  - <(dateutils.dseq 2019-01-01 2021-12-31 --format "%Y/%m/%d") -a 2 | awk '$2=NF==1?"@":$2' OFS=, | head
2019/01/01,元日
2019/01/02,@
2019/01/03,@
2019/01/04,@
2019/01/05,@
2019/01/06,@
2019/01/07,@
2019/01/08,@
2019/01/09,@
2019/01/10,@
...

シェル芸160ノック11

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題52

awk '{print FILENAME,$0}' qdata/52/* | awk '$2=="*"{for(i=3;i<=NF;i++)a[i]=$i}$2!="*"{for(k in a) print $1,$2,a[k],$k}' | sel -d_ 2
U X A 4
U X B 2
U Y A 3
U Y B 1
V X A 7
V X B 6
V X C -1
V Y A 9
V Y B 8
V Y C -2

問題53

$ (cat ./qdata/53/devicelist.txt;awk '{print "@",$1}' ./qdata/53/measurement.txt) | sort -k2 | uniq -f1 | join - <((sel 2 1 -f ./qdata/53/measurement.txt;awk '{print "@",$2}' ./qdata/53/devicelist.txt) | sort -k2 | uniq -f1) -1 2 -2 2 | sel 2 1 3 | sort -k1n
@ xxxx.0d81.33a8 1607
@ xxxx.17d0.2c07 3431
01 xxxx.0c4d.1c45 1914
02 xxxx.0d46.f3c2 @
03 xxxx.0d17.73a6 2275
04 xxxx.0d81.33b8 @
05 xxxx.0d17.9658 @
06 xxxx.0c4d.095c 3235
07 xxxx.0a69.b711 3119
08 xxxx.0d81.1da2 @
09 xxxx.0fff.d828 3618
10 xxxx.0d17.7478 3443

問題54

$ jq -rc '.Fruits[] | .Name+".json",.' ./qdata/54/fruits.json | paste - - -d ' ' | while read F L; do echo $L|jq > $F; done

問題55

$ (echo \[;sed 's/$/,/' qdata/55/watch_log.json;echo {}\]) | gron | grep -Pe "timestamp|output" | sel 3: | sd '\\' '\\\' | while read L; do read T; [[ "$tt" == "" ]] &&{tt=$T;ll=$L;} || { echo diff: $tt $T; echo -e $ll | diff - <(echo -e $L);tt=$T;ll=$L; }; done
diff: "2020-01-18 18:07:34"; "2020-01-18 18:06:52";
1,3c1,3
< total 9888204
< drwxr-xr-x  19 uesugi staff        608  1 18 18:07 .
< drwxr-xr-x+ 86 uesugi staff       2752  1 18 18:07 ..
---
> "total 9888204
> drwxr-xr-x  19 uesugi staff        608  1 12 23:22 .
> drwxr-xr-x+ 86 uesugi staff       2752  1 18 18:06 ..
21c21
< ;
---
> ";
diff: "2020-01-18 18:06:52"; "2020-01-18 18:07:06";
3c3
< drwxr-xr-x+ 86 uesugi staff       2752  1 18 18:06 ..
---
> drwxr-xr-x+ 86 uesugi staff       2752  1 18 18:07 ..
diff: "2020-01-18 18:07:06"; "2020-01-18 18:07:20";
2c2
< drwxr-xr-x  19 uesugi staff        608  1 12 23:22 .
---
> drwxr-xr-x  20 uesugi staff        640  1 18 18:07 .
19a20
> -rw-r--r--   1 uesugi staff          0  1 18 18:07 aaa
diff: "2020-01-18 18:07:20"; "2020-01-18 18:07:26";
2c2
< drwxr-xr-x  20 uesugi staff        640  1 18 18:07 .
---
> drwxr-xr-x  21 uesugi staff        672  1 18 18:07 .
20a21
> -rw-r--r--   1 uesugi staff          0  1 18 18:07 bbb
diff: "2020-01-18 18:07:26"; "2020-01-18 18:07:32";
2c2
< drwxr-xr-x  21 uesugi staff        672  1 18 18:07 .
---
> drwxr-xr-x  20 uesugi staff        640  1 18 18:07 .
20d19
< -rw-r--r--   1 uesugi staff          0  1 18 18:07 aaa
diff: "2020-01-18 18:07:32"; "2020-01-18 18:07:34";
2c2
< drwxr-xr-x  20 uesugi staff        640  1 18 18:07 .
---
> drwxr-xr-x  19 uesugi staff        608  1 18 18:07 .
20d19
< -rw-r--r--   1 uesugi staff          0  1 18 18:07 bbb

うーむこれは確かに別ファイルにそれぞれ書き出してdiffした方がよかったかもしれない

問題56

$ sed -e "$(cat qdata/56/service_stop_weekday.txt | awk -F: '{printf "s/%s/%s/;", $1,$2}' )" ./qdata/56/service_depend_list.txt | sel --remove-empty -gd :\|\\s\|, 0 | awk '{for(i=2;i<=NF;i++)a[$i]=$1","a[$i]}END{for(k in a)print k,a[k]}' | while read D L; do echo $D "$(sd , \\n <<< $L|sort -u|sed '/^$/d'|paste -sd ,)"; done | sed 'y/月火水木金土日/1234567/' | sort -k1 | sed 'y/1234567/月火水木金土日/;s/^./&:/' | sd , ', '
月: アプリA, アプリC, アプリD
火: アプリB, アプリC, アプリE
水: アプリB, アプリC, アプリE
木: アプリA
金: アプリC, アプリD
土: アプリA, アプリB, アプリC, アプリD, アプリE
日: アプリB, アプリE

長くなってまいりました

シェル芸160ノック10

9月末に発売されたシェル芸本の続きです。データの集計・変形は普段からよくやるからか手段が思いつきやすいですね

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題47

$ cat qdata/47/mom.csv | awk -F, '{if(s){$3=($2/s-1)*100;$3=($3<0?$3:"+"$3)"%"}else{$3="*"};s=$2;print}' OFS=,
2017/01,108192,*
2017/02,134747,+24.5443%
2017/03,120420,-10.6325%
2017/04,147368,+22.3783%
2017/05,262456,+78.0957%
2017/06,280741,+6.96688%
2017/07,315083,+12.2326%
2017/08,522489,+65.8258%
2017/09,489003,-6.40894%
2017/10,729017,+49.0823%
2017/11,987173,+35.4115%
2017/12,1025320,+3.86427%

問題48

$ ps aux | sed 1d | awk '{a[$1]+=$3;t[$1]++}END{for(k in a)print k, a[k], t[k]}' | sort -k2nr
xztaity+ 0.4 13
root 0 3

問題49

$ cat qdata/49/top.log | awk '/^\s+PID/,/^top/' | grep -vPe "^\s+PID|^top" | sel --remove-empty 9 12: | sort -k1nr | head
93.8 /root/test/load_nakamura 2 600000 100000
93.8 /root/test/load_ueda 3 600000 100000
88.2 /root/test/load_nakamura 2 600000 100000
88.2 /root/test/load_ueda 3 600000 100000
61.1 /root/test/load_ueda 3 600000 100000
53.3 /usr/bin/python3 /usr/sbin/iotop -b -n 1 -t -k
50.0 /root/test/load_nakamura 2 600000 100000
50.0 /root/test/load_ueda 3 600000 100000
47.4 /usr/bin/python3 /usr/sbin/iotop -b -n 1 -t -k
47.1 /root/test/load_nakamura 2 600000 100000

これはたまにやる

問題50

$ cat qdata/50/sales | awk '{a[$3$4]+=$5}END{for(k in a)print k, a[k]}' | sort | join - <(sed 's/ //' ./qdata/50/stones_master) | awk '{print $3,$2*$4}'
シェル石 1500
非行石(青) 10000
非行石(偽物・赤) 70
おじいちゃんから出た石 31
デーモンコア 200000

おじいちゃんから出た石

問題51

$ (cat qdata/51/scores.txt | awk '{printf "%03d %d\n", $1,$2}'; awk '{print $1,0}' qdata/51/students.txt) | sort -k1,2n | awk '{a[$1]=$2}END{for(k in a)print k, a[k]}' | sort | join - qdata/51/students.txt | sel 1 3 2
001 井田 0
002 上田 40
003 江田 0
004 織田 0
005 加田 80
006 木田 95
007 久田 0
008 山田 76

シェル芸160ノック9

9月末に発売されたシェル芸本の続きです。問題45がとんでもなく難しく初めてギブしました

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題42

cat qdata/42/item.md | teip -og '^(#|\d.)' -- awk '{$1=="#"?s=1:$1=s++".";print}'
# AAA

1. AAAはすごいな
2. AAAはたのしいな
3. AAAはきれいだな

# BBB

1. BBBはすごいな
2. BBBはたのしいな
3. BBBはきれいだな
4. BBBはゆかいだな
5. BBBは・・・

teipでawkの式が少しだけ単純になったかな?

問題43

$ cat qdata/43/bunken.txt | sed '/^$/d' | awk 'NR%2==0{print $0}NR%2!=0{printf "%s ", $0}' | sort | awk '{s=$NF;$NF="";printf "%s\n%s\n\n",$0,s}'
[1] 日々之迷歩
https://papiro.hatenablog.jp/

[2] くんすとの備忘録
https://kunst1080.hatenablog.com/

[3] シェル芸 | 上田ブログ
https://b.ueda.tech/?page=01434

[4] トップページ | gihyo.jp, 技術評論社
https://gihyo.jp/

[5] 俺的備忘録
https://orebibou.com/

問題44

$ cat qdata/44/diary.txt | sed -zE 's/シ.?ェ.?ル.?ス.?ク.?リ.?プ.?ト/_&_/g' | awk '/_/{print $0, "@"}!/_/' | tr -d _
今日もシェルスクリプトを書いた。その @
後、ストロング系のチューハイを3本飲
み、少し休憩した後に人の書いたシェル @
スクリプトを手直しした。体内にアル @
コールがまわり、意識が朦朧とする中、
シェルスクリプトかわいいよシェルスク @
リプトという謎ワードが前頭葉をぐるぐ @
るして止まらなくなったので、もうだめ
だと思って寝た。

問題45

ギブ…

問題46

$ cat qdata/46/const26.txt | mecab | teip -g '^\p{Han}' -- awk -F'[,: ]' '{print $8}' | awk '{print $1}' | sed -E 's@(.+)/(.+)@\1 \2@' | sed -E 's@^([^ぁ-ん]+)([ぁ-ん]*)? (.+)\2@\1(\3)\2@g' | paste -sd '' | sd EOS ''
憲法(けんぽう)第(だい)26条(じょう)1項(こう):すべて国民(こくみん)は、法律(ほうりつ)の定(さだ)めるところにより、その能 力(のうりょく)に応(おう)ずる、ひとしく教育(きょういく)を受(う)ける権利(けんり)を有(ゆう)する。

シェル芸160ノック8

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題37

$ cat qdata/37/diarydiary.txt | paste -sd '' | grep -oPe "(.+)\1"
私は私は
シェル芸シェル芸
問題問題
すす
いろいろ

問題38

$ cat qdata/38/this_is_it.txt | sed -E ':a;s/&amp;/\&/g;/amp/b a;s/&quot;/"/g'
$ x='() { :;}; echo vulnerable' bash -c 'echo this is a test'
vulnerable
this is a test

sedのラベル、初めて使ったまである

問題39

$ cat qdata/39/bash_description.txt | fmt -31
Bash is an sh-compatible
command language interpreter
that executes commands read
from the standard input
or from a file. Bash also
incorporates useful features
from the Korn and C shells
(ksh and csh).

manだとハイフネーションもできるのすごい

問題40

$ cat qdata/40/kanjinum.txt | sed -zE 's@\n(。|、)@\1\n@g' | teip -og '[一|四|五|七|十|百|千|兆]+' -- numconv
私が小学1年生の時は、
47都道府県の位置
と名前を全て覚えるくらいに
物覚えは良かったですが、
テストで100点満点を
取り、親から5000000000000000円を
プレゼントされることは
ありませんでした。

Onigurumaを使えば、\p{No}+で漢数字はマッチできる気がしたけどできなかった

問題41

$ cat qdata/41/annotation.md | grep -oPe "\[\^about_.\]:?" | sort -u | sd '\]$' '] 目印' | sd ':$' '  注釈' | sel 2 1 | uniq -f1 -u
目印 [^about_b]
注釈 [^about_d]
注釈 [^about_f]

uniqってフィールドの無視できたんですね~知らなかった。

シェル芸160ノック7

9月末に発売されたシェル芸本の続きです。正規表現めちゃめちゃに難しい

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題31

$ cat qdata/31/iampen.txt | perl -pe "s{(?<=<strong>)([^<]+)}{\U\$1}"
This is <strong>A PEN</strong>. I am a pen.
<pre>Are you pen?</pre> <strong>YES</strong>, I am.

問題32

$ cat qdata/32/kaibun.txt | ocs 'F0==string.Join("",F0.Reverse()){println(F0)}'
たけやぶやけた
らくまのまくら
くまをまく
わたしまけましたわ
まさかさかさま

問題33

$ cat qdata/33/kaibun | grep -o . | sel 1 1 | teip -f2 tac | awk 'BEGIN{s=1}{s=s&&$1==$2}END{if(s)print "回文"}'
回文
$ cat qdata/33/not_kaibun | grep -o . | sel 1 1 | teip -f2 tac | awk 'BEGIN{s=1}{s=s&&$1==$2}END{if(s)print "回文"}'

問題34

$ cat qdata/34/furigana.txt | sel 2 1 | sed -E 's@^([^ぁ-ん]+)([ぁ-ん]*)? (.+)\2@\1(\3)\2@g'
山田(やまだ)
頑張(がんば)る
爆発(ばくはつ)する
激(はげ)しい

問題35

$ cat qdata/35/speech.txt | grep -oPe "^.*?\p{Katakana}{4}(?=\p{Katakana})" | awk '{print length, $0}'
25 21世紀に入ってからのIT業界を中心としたパラダイ
4 ジャスト
45 個人間であらゆるアセットをシェアするビジネスが注目を浴びており、共有経済、いわゆるシェアリ
22 顧客体験の高品質化、満足度、いわゆるサティス

問題36

$ cat qdata/36/message.txt | sed 's/)(/)\n(/g' | sd '\(' 'a' | sd '\)' 'b' | ocs "F0.Count(x => x == 'a')==F0.Count(x => x == 'b'){print(F0.Replace(\"a\",\"\").Replace(\"b\",\"\"))}"
いんしゅ

ocsのパーサーバグってて、文字列内にカッコがあると死ぬのでa,bにReplaceしました…。なおします…。

シェル芸160ノック6

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題26

$ function zshaddhistory() { local now="$(date +%H)"; [[ "$now" -ge 18 ]] || [[ "$now" -le 4 ]] && echo "早く帰れ" }

解答例みたいにすべての行動で「早く帰れ」が出力されるわけじゃないのでちょっと寂しい

問題27

$ !!:s/3/1/

問題28

$ rm -Rf -- ./~ ./-Rf

問題29

$ shellcheck qdata/29/fb.bash | grep -oPe "(?<=line )\d+"
6

github.com

問題30

$ set | while read L; do [[ "$L" =~ ^BASH ]] && echo
${L//=*/}; done
BASH
BASHOPTS
BASH_ALIASES
BASH_ARGC
BASH_ARGV
BASH_CMDS
BASH_COMPLETION_VERSINFO
BASH_LINENO
BASH_SOURCE
BASH_VERSINFO
BASH_VERSION