たいちょーの雑記

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

シェル芸160ノック19

9月末に発売されたシェル芸本の続きです。ついに100問を超えた

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題98

$ csvq -f CSV -n -r ./qdata/98/ 'select case when list1.c1 not in (select * from list2) then list1.c1 else "@" end, case when list2.c1 not in (select * from list1) then list2.c1 else "@" end, case when list1.c1 in (select * from list2) then list1.c1 else "@" end from list1, list2'  | sed 1d | sel -d, 0 | awk '{if($1!="@" && !a[$1]++) print $1 >> "oneside";if($2!="@" && !a[$2]++) print $2 >> "oneside";if($3!="@" && !a[$3]++) print $3 >> "common"}'

$ head oneside common
==> oneside <==
シュル芸
シァル芸

==> common <==
シェノ芸
シェル芸
シェレ芸
ンェル芸

問題99

# 小問1
cat qdata/99/cards.txt | ocs 'F.Skip(1).Where((v,i)=>i%2==0).Distinct().Count()==1{println(F0)}'789111389101112910111213


# 小問2
$ cat qdata/99/cards.txt | awk '($2==$4&&$4==$6&&$8==$10)||($2==$4&&$6==$8&&$8==$10)'55111111333111122131313

問題100

$ csvq -f CSV -n -r ./qdata/100/ "select * from $(echo {b..g} | fmt -1 | awk 'BEGIN{print "shiritori as a"}{print "cross join shiritori as "$1}' | paste -sd ' ')" | sed 1d | grep -Pe '(.+(.),\2){6}' | ocs -F, 'F.Skip(1).Distinct().Count()==7{println(F0)}'
けんこう,うがい,いちょう,うしみつどき,きゅうけい,いんどあ,あけがた
けんこう,うしみつどき,きゅうけい,いちょう,うがい,いんどあ,あけがた

重複なしの組み合わせを列挙すればよかったね

問題101

$ cat qdata/101/alphabet_connection | fmt -1 | sort | join - <(echo {a..z}|fmt -1) -a 2 -o 1.1 | awk '!/^$/{a=a","$1}/^$/{print a;a=""}END{print a}' | sd "^," '' | sed '/^$/d' | sd -- ',.*,?(.)' '-$1' | xargs
a-c e-f i-l p-r u w y-z

問題102

$ hoge() {echo "hoge $*"}; hoge fuga
hoge fuga

こういうことではないっぽいな…

シェル芸160ノック18

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

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題90

$ echo 12 4 34 8 56 16 | xargs -n2 | awk '{print "numconv -b"$2" <<< "$1}'  | bash| jq -s add
120

問題91

$ echo {2,3,5,7},{2,3,5,7},{2,3,5,7} | fmt -1 | awk -F, '$1<=$2&&$2<=$3&&$1+$2>$3'
2,2,2
2,2,3
2,3,3
2,5,5
2,7,7
3,3,3
3,3,5
3,5,5
3,5,7
3,7,7
5,5,5
5,5,7
5,7,7
7,7,7

問題92

$ yes | ocs '0.01*Math.Pow(2,NR)>1000*1000*1000{println(NR);Environment.Exit(0)}'
37

問題93

dateutils.dseq --format "%Y%m%d%H%M%S" 2019-01-01T00:00:00 1s 2021-12-31T00:00:00 | factor | awk 'NF==2{print $2;exit}'
20190101000023

問題94

$ echo {0..10},{0..10},{0..10},{0..10} | fmt -1 | awk -F, '$1^2+$2^2+$3^2+$4^2<=100{print $0,$1^2+$2^2+$3^2+$4^2}' | sort -k2n | uniq -f1 | sed 1d
0,0,0,1 1
0,0,1,1 2
0,1,1,1 3
0,0,0,2 4
0,0,1,2 5
0,1,1,2 6
1,1,1,2 7
0,0,2,2 8
0,0,0,3 9
0,0,1,3 10
0,1,1,3 11
0,2,2,2 12
0,0,2,3 13
0,1,2,3 14
1,1,2,3 15
0,0,0,4 16
0,0,1,4 17
...

問題95

$ seq 0 8 | ocs "{println(Convert.ToString(i(F0) ^ i(F0)>>1,2).PadLeft(8,'0'))}"
00000000
00000001
00000011
00000010
00000110
00000111
00000101
00000100
00001100

問題96

$ awk '{a[$0]++;b[$0]=b[$0]","FILENAME}END{for(k in a) if(a[k]==3) print k""b[k]}' * | sort | sel -d, 0
2019/07/10 user1 user2 user3
2019/07/15 user1 user3 user4

問題97

$ cat qdata/97/tate.txt | sd '(.)' '"$1" ' | awk '{for(i=1;i<=NF;i++)printf "%s ", $i; for(i=NF;i<=17;i++) printf "\" \"";print "";}' | rs -T | tr -d \"\  | ocs '{println((NR,F0.IndexOf("たてよみ")+1))}' | tr -d '(),' | awk '$2==1{print $2,$1}'
1 3

シェル芸160ノック17

9月末に発売されたシェル芸本の続きです。いつの間にか半分終わってた

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題85

$ echo 🍑 🍓 |  xxd -ps | sd '0a' '' | sd '20' ' ' | fmt -1 | xargs -n1 -I@ printf "%d\n" 0x@ | numaverage | numconv -t Hexadecimal_Lower | sd 0x '' |  xxd -ps -r | awk 4
🍒

numconv -f Hexadecimal_Lowerで変換したかったけど、最上位桁消えちゃったので悲しかった

問題86

$ cat qdata/86/fractions | uni i | sed 1d | sel --remove-empty 10 11 | sed -E "$(cat qdata/86/word_to_num | awk '{print "s/"$1"|"$2"/"$3"/ig"}'|paste -sd\;)" | tr -d S | awk 'BEGIN{printf "puts "}{printf "+Rational(%d,%d)",$1,$2}' | ruby
131/72

分数で表示しないといけないとはな

問題87

$ cat qdata/87/oct.txt | head -n2 | sel 2: | fmt -1 | numconv -b 8 | xargs -n1 printf "%04x\n" | sd '(..)(..)' '$2$1' | tr -d \\n | command xxd -ps -r
秒速で10円稼ぐ秘密

問題88

$ command cat qdata/88/image_masked.bmp | convert - -compress none pnm:- | tail +4 | tac | fmt -1 | paste - - - -d ' ' | sel 3 | numconv -B 2 | sd '.+(.)$' \$1 | tr -d \\n | numconv -b2 -B16 | command xxd -p -r
Hello, 私だ。
以下は私の個人情報だ!!
絶対に漏らすなよ!!!
...

問題89

$ cat qdata/89/ctf-data | base64 -d | gunzip > o
$ ./o | command xxd -ps | grep -o .. | sed 's/^/0x/' | numconv -f Hexadecimal_Lower | awk '!/^(32|10)$/{$1-=2}4' | numconv -B 16 | tr -d \\n | command xxd -p -r
FLAG is shell-gei

シェル芸160ノック16

9月末に発売されたシェル芸本の続きです。無敵のteipコマンドありがとう

gihyo.jp

前回はこちら

https://xztaityozx.hatenablog.com/entry/2021/12/08/220451:cite:mebed

問題79

# ↓でテキトウにいい感じの出力になってるのを目で探す
$ iconv --list | fmt -1 | sd // '' | xargs -n1 -I@ zsh -c "iconv ./qdata/79/message.txt -f @ 2>/dev/null && echo @"


$ iconv -f IBM1390 ./qdata/79/message.txt
イカれたメンバーを紹介するぜ!
真イカのパプリカソースの修平

以上だ!

イカれてるぜ!

問題80

$ cat qdata/80/zeroone | opy '[hex(int(str(F1),2))]' | sd 0x '' | xxd -p -r
不労所得

ワロタ

問題81

$ cat qdata/81/bom.txt | sel 1 1 | teip -f1 -- zsh -c "xxd -p | grep -Pe '^efbbbf' &> /dev/null  && echo '[BOM]'"
[BOM] <feff>ボムボムプリンおいしい


$ cat qdata/81/nobom.txt | sel 1 1 | teip -f1 -- zsh -c "xxd -p | grep -Pe '^efbbbf' &> /dev/null  && echo '[BOM]'||echo ''"
 ボムボムプリン完売

問題82

$ split -b 1000 --numeric-suffixes=1 image.bmp image.bmp.

splitってこういうコマンドだったんだ

問題83

$ iconv qdata/83/soleil.bash -f sjis | sed 1d | sel 2 | sd '(.+)' 'iconv -f utf8 -t sjis <<< "$1"' | sed 1i'#!/bin/bash' > new_soleil.bash

$ cat new_soleil.bash
#!/bin/bash
iconv -f utf8 -t sjis <<< "親戚のソレイユちゃんは表情が豊かで可愛い女の子。"

$ bash new_soleil.bash | iconv -f sjis
親戚のソレイユちゃんは表情が豊かで可愛い女の子。

sjisな文字列をそのままechoしてるわけじゃないからレギュレーション違反な可能性がある

問題84

$ zcat qdata/84/newline.txt.gz|xxd -ps|grep -oPe '0d0a|0a' | sort | uniq -c | sort -rn | sd '0d0a' 'CRLF' | sd '0a' 'LF' | sel -gd\\s+ --remove-empty 2 1
CRLF 8
LF 8

シェル芸160ノック15

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

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題74

$ cat qdata/74/days.txt | ocs -ISystem.Globalization '{var j=new CultureInfo("ja-JP");j.DateTimeFormat.Calendar = new JapaneseCalendar();println(DateTime.Parse(F0).ToString("ggy年M月d日", j))}'
平成3133日
令和元年1010日
令和281

問題75

$ cat qdata/75/minutes.txt | teip -oGg '[^#*\P{Emoji}]\u200d?' -- sed 's/.*//g'
# 本日のミーティングの議題

* 今月の売り上げ
* 新商品️の報告(山田さん)
* 研究開発の進捗

...

問題76

$ uconv -x NFC qdata/76/mac_ls_old.txt | diff - ./qdata/76/mac_ls_new.txt
2d1
< バナザード.txt

問題77

$ ls qdata/77 | sd '_(.+)' '_$1 $1' | sd 'euc$' 'EUC-JP' | while read B C; do iconv -f $C ./qdata/77/$B | sd '^' "$B:"; done | grep 山田
meme_euc:我が生涯に一片の山田なし!
meme_utf8:守りたい、この山田

問題78

$ cat qdata/78/jouyou_kanji.txt|grep -f- -v <(grep -o . qdata/78/sample_novel.txt) | grep -Pe '\p{Han}'
智
皰
噛
云
鴎

シェル芸160ノック14

9月末に発売されたシェル芸本の続きです。文字コードに突入した。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題68

$ s=0;t="$(bc <<< 2^100)";while [[ $(bc <<< $t-$s) != 1 ]]; do m=$(bc <<< "($t+$s)/2"); echo $m; date -d @$m && s=$m || t=$m; done
67768036191644399
Wed Dec 31 23:59:59 JST 2147485547

ocsで解こうとしたらパーサーバグってて実行できなかったわ。ガハハ!

問題69

$ curl  https://ja.wikipedia.org/wiki/%E9%96%8F%E7%A7%92 > a
$ cat a | grep -Pe "<t[dh]" | grep -Pe "\d{4}年" -A 4 | sd '.+(\d{4})年.+' '$1' | sd '</?td>' '' | sd '.+(\+1).+' '1'  | grep -vPe "秒|th" | xargs -n3 | awk '$2==1{print $1"/01/01"}$3==1{print $1"/07/01"}'               1972/07/01
1973/01/01
1974/01/01
1975/01/01
1976/01/01
1977/01/01
1978/01/01
1979/01/01
1980/01/01
1981/07/01
1982/07/01
1983/07/01
1985/07/01
1988/01/01
1990/01/01
1991/01/01
1992/07/01
1993/07/01
1994/07/01
1996/01/01
1997/07/01
1999/01/01
2006/01/01
2009/01/01
2012/07/01
2015/07/01
2017/01/01

問題70

$ cat qdata/70/excel_hogan.txt | sd '(.)' '"$1",' | sd '"""' '"\\""' | sd ',$' ''
"エ","ク","セ","ル","方","眼","紙","と","い","う","ど","う","し","よ","う","も","無","い"
"風","習","が","あ","り","ま","す","が","、","我","々","は","文","句","を","言","い","つ"
"つ","も","、","従","わ","ざ","る","を","得","な","い","状","況","に","し","ば","し","ば"
"立","た","さ","れ","ま","す","。","最","後","に","一","言","。"
"\"","N","o"," ","h","o","g","a","n",","," ","n","o"," ","l","i","f","e",".","\""

Excel方眼紙って存在するの?

問題71

$ cat qdata/71/uni.txt | uni i -json | jq -r '.[]|.char+": "+.utf8' | awk '{print $1,NF-1}'
a: 1
±: 2
運: 3
🎂: 4

github.com

問題72

$ echo -e \\U1F3{63,7A}
🍣 🍺

問題73

$ paste <(command ls|grep -av zip) <(command ls | grep -av zip|iconv -f sjis) | xargs -n2 mv
$ ls
ぴーでーえふ.pdf  倒立変態紳士の秘密.txt  秘密の圧縮ファイル.zip

alias ls=exaにしててexaだと文字化けがさらに化けてしまったのでcommandをつけた

シェル芸160ノック13

9月末に発売されたシェル芸本の続きです。日付変換系はいろんなテクニックやオプションが解説で見られて楽しいですねえ

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題63

$ dateutils.dseq --format "%Y-%m %w" 2021-01-01 2021-12-31 | awk '$2==00{a[$1]++}END{for(k in a)if(a[k]==5)print k}' | sort
2021-01
2021-05
2021-08
2021-10

問題64

$ dateutils.dseq -s we-mo --format "%Y-%m %d" 2021-01-01 2021-12-31 | awk '{a[$1]=a[$1]","$2}END{for(k in a)print k""a[k]}' | sel -d, -D- 1 4 | sort
2021-01-19
2021-02-16
2021-03-16
2021-04-20
2021-05-18
2021-06-15
2021-07-20
2021-08-17
2021-09-21
2021-10-19
2021-11-16
2021-12-21

問題65

$ uconv -f sjis qdata/62/syukujitsu.csv | awk -F'[/|,]' '/2019/{printf "%d %02d %02d %s\n", $1,$2,$3,$4}' | cat - <(dateutils.dseq -s mo-fr 2019-01-01 2019-12-31 --format "%Y %m %d %a") | sd 'Sun' '日曜日' | sd 'Sat' '土曜日' | sort -k2,3 -u | sel -D- 1 2 | uniq -c
     10 2019-01
      9 2019-02
     11 2019-03
     10 2019-04
     12 2019-05
     10 2019-06
      9 2019-07
     10 2019-08
     11 2019-09
     10 2019-10
     10 2019-11
      9 2019-12

問題66

# 翌週の火曜日
dateutils.dseq 2017-01-01 2017-12-31 | dateutils.dgrep "%W=$(($(date -d 2017-09-18 +%W)+1))&&%w=02"
2017-09-26

# その翌週の金曜日
$ dateutils.dseq 2017-01-01 2017-12-31 | dateutils.dgrep "%W=$(($(date -d 2017-09-26 +%W)+1))&&%w=05"
2017-10-06

# その前日
date -d "2017-10-06 1 days ago" +%F
2017-10-05

問題67

$ cat qdata/67/dinner | teip -f1 -- date -f- +"%Y%m%d %a" | while read D A M; do echo "$D $M" >> $A;done