シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/
探検
シェルスクリプト総合 その30
■ このスレッドは過去ログ倉庫に格納されています
2019/07/01(月) 23:04:27.02ID:/rKj5XUf
638633
2019/08/08(木) 07:20:32.75ID:/tBUMiMq JavaScript で、: は、オブジェクトの属性だろ。
だから、{ } 内でしか使えない
だから、1 はダメで、2, 3 はOK
1. {"item1":["key1":"value1"]}
2.1 {"item1":["value1"]}
2.2 {"item1":["key1","value1"]}
3. {"item1":[{"key1":"value1"}]}
だから、{ } 内でしか使えない
だから、1 はダメで、2, 3 はOK
1. {"item1":["key1":"value1"]}
2.1 {"item1":["value1"]}
2.2 {"item1":["key1","value1"]}
3. {"item1":[{"key1":"value1"}]}
639デフォルトの名無しさん
2019/08/08(木) 07:25:15.97ID:l7k6B2kQ フォーマットが不自然なんだよな。独自フォーマットなら
その仕様を言ってくれないと答えようがない。
例えば、そこに書いてあるキー以外も存在するのか?とか
改行はどうなってるのかとか
その仕様を言ってくれないと答えようがない。
例えば、そこに書いてあるキー以外も存在するのか?とか
改行はどうなってるのかとか
640デフォルトの名無しさん
2019/08/08(木) 09:21:44.35ID:rLFqUIXU641デフォルトの名無しさん
2019/08/08(木) 10:06:35.63ID:X/CTiqlR 本物のjsonにしちゃえ
独自フォーマットする利点ないでしょ
独自フォーマットする利点ないでしょ
642デフォルトの名無しさん
2019/08/08(木) 11:39:13.74ID:/tBUMiMq 独自形式など、作るだけ無駄
パーサーを作るにも、特殊文字のエスケープ処理など、バグが増えるだけ!
パーサーを作るにも、特殊文字のエスケープ処理など、バグが増えるだけ!
643デフォルトの名無しさん
2019/08/08(木) 11:47:10.43ID:FeKpuToe 昨日質問したものですが中途半端に書いてしまい申し訳ありませんでした
まだ勉強不足の学生でして……
こっちが正しいjsonと出力させたい内容です
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]},"あああ":{"いいい":["ううう"]}}
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]}}
{}
{"aaa":{"bbb":["ccc"]}}
↓
aaa,xxx,あああ
ccc,zzz,いいい
ccc,zzz,
,,
ccc,,
まだ勉強不足の学生でして……
こっちが正しいjsonと出力させたい内容です
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]},"あああ":{"いいい":["ううう"]}}
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]}}
{}
{"aaa":{"bbb":["ccc"]}}
↓
aaa,xxx,あああ
ccc,zzz,いいい
ccc,zzz,
,,
ccc,,
644デフォルトの名無しさん
2019/08/08(木) 11:47:20.30ID:FeKpuToe jsonlですね
645デフォルトの名無しさん
2019/08/08(木) 11:53:47.59ID:FeKpuToe aaa,xxx,あああ
ccc,zzz,ううう
ccc,zzz,
,,
ccc,,
です
ccc,zzz,ううう
ccc,zzz,
,,
ccc,,
です
646デフォルトの名無しさん
2019/08/08(木) 12:28:53.27ID:FeKpuToe 連レスすみません
例えばaaaとあああだけ抜き取りたい場合
さきほどのjsonlから
aaa,あああ
ccc,ううう
ccc,
,
ccc,
と表示させる方法も知りたいです。
全部表示させた後にawkで削除した方がいいのでしょうか?
例えばaaaとあああだけ抜き取りたい場合
さきほどのjsonlから
aaa,あああ
ccc,ううう
ccc,
,
ccc,
と表示させる方法も知りたいです。
全部表示させた後にawkで削除した方がいいのでしょうか?
647デフォルトの名無しさん
2019/08/08(木) 12:42:36.15ID:X/CTiqlR 使いまわせるから
...|awk 'Xxx'
...|awk 'Xxx'
648デフォルトの名無しさん
2019/08/08(木) 12:46:24.42ID:0w2TiazL649デフォルトの名無しさん
2019/08/08(木) 12:56:15.36ID:PTwvjoI/650デフォルトの名無しさん
2019/08/08(木) 13:40:08.52ID:l7k6B2kQ >>646
もとのデータが悪かっただけ。
jsonlだったらjqで普通に扱える。
echo "aaa,xxx,あああ";
jq -r '[.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]] | @csv' data.jsonl
ダブルクォートがいらないなら、@csvをjoin(",")にする
こことか見れば良い
https://medium.com/veltra-engineering/jq-supports-json-to-csv-fb5c951a9575
もとのデータが悪かっただけ。
jsonlだったらjqで普通に扱える。
echo "aaa,xxx,あああ";
jq -r '[.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]] | @csv' data.jsonl
ダブルクォートがいらないなら、@csvをjoin(",")にする
こことか見れば良い
https://medium.com/veltra-engineering/jq-supports-json-to-csv-fb5c951a9575
651デフォルトの名無しさん
2019/08/08(木) 14:01:33.05ID:SmETYGNQ652デフォルトの名無しさん
2019/08/08(木) 14:03:20.11ID:l7k6B2kQ なるほどjqコマンドだけでやるにはこうすればいいのか
jq -r -s '["aaa","xxx","あああ"], (.[] | [.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]]) | @csv' data.jsonl
jq -r -s '["aaa","xxx","あああ"], (.[] | [.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]]) | @csv' data.jsonl
654デフォルトの名無しさん
2019/08/08(木) 14:12:53.47ID:DLp++heI なんだかなーw
655デフォルトの名無しさん
2019/08/08(木) 14:16:46.09ID:SmETYGNQ 今調べてみたら
.aaa.bbb[]と入力していたので全部一致してないとエラーになってたっぽいです
.aaa.bbb[0]に変えている>>650では一致してないところも空欄で出力されてましたので求めるものでした
.aaa.bbb[]と入力していたので全部一致してないとエラーになってたっぽいです
.aaa.bbb[0]に変えている>>650では一致してないところも空欄で出力されてましたので求めるものでした
656デフォルトの名無しさん
2019/08/08(木) 14:20:36.14ID:10jj0QOT >>653
もしかして皮肉という概念をご存知ない…?
もしかして皮肉という概念をご存知ない…?
657デフォルトの名無しさん
2019/08/08(木) 14:26:26.08ID:DLp++heI658デフォルトの名無しさん
2019/08/08(木) 14:29:47.06ID:SmETYGNQ >>657
要素数は一つですので大丈夫です。
要素数は一つですので大丈夫です。
659デフォルトの名無しさん
2019/08/08(木) 14:41:50.23ID:DLp++heI >>658
問題ないならいいけど [0] より []? 使ったほうが良いよ
問題ないならいいけど [0] より []? 使ったほうが良いよ
660デフォルトの名無しさん
2019/08/08(木) 14:45:49.24ID:PRJfiUWC bashって可変長引数で綺麗に処理できないの?
bash test.sh a b c d e
って打ったら
xaz,xbz,xcz,xdz,xez
bash test.sh a b c
って打ったら
xaz,xbz,xcz
って出るものを作りたいんだが$@を使って色々やっても
xa b c d ez,
って出力しかできぬ
bash test.sh a b c d e
って打ったら
xaz,xbz,xcz,xdz,xez
bash test.sh a b c
って打ったら
xaz,xbz,xcz
って出るものを作りたいんだが$@を使って色々やっても
xa b c d ez,
って出力しかできぬ
662631
2019/08/08(木) 14:50:53.94ID:l7k6B2kQ printf 'x%sz,' a b c d e
xaz,xbz,xcz,xdz,xez,
xaz,xbz,xcz,xdz,xez,
663デフォルトの名無しさん
2019/08/08(木) 14:55:38.24ID:X/CTiqlR >>660
while [ $# -gt 0 ];
do
printf x
printf $1
printf "z\n"
shift
done
sh multi_arg.sh a b c d e
xaz
xbz
xcz
xdz
xez
\nいらなかったな
あと間に,でやるやつ必要か
そのへんpass
while [ $# -gt 0 ];
do
printf x
printf $1
printf "z\n"
shift
done
sh multi_arg.sh a b c d e
xaz
xbz
xcz
xdz
xez
\nいらなかったな
あと間に,でやるやつ必要か
そのへんpass
664631
2019/08/08(木) 15:01:30.29ID:l7k6B2kQ ぶっちゃけ $@ を使ってどうやれば
xa b c d ez, が出せるんだろうって悩むレベルw
xa b c d ez, が出せるんだろうって悩むレベルw
665デフォルトの名無しさん
2019/08/08(木) 15:10:54.30ID:PTwvjoI/ $ set -- {a..e}
$ l=;for v in "$@";do l="${l}${l:+,}${v}";done;echo "$l"
for 文で "in" を省略すると "$@" が対象になるので
$ l=;for v;do l="${l}${l:+,}${v}";done;echo "$l"
としても可。
$ l=;for v in "$@";do l="${l}${l:+,}${v}";done;echo "$l"
for 文で "in" を省略すると "$@" が対象になるので
$ l=;for v;do l="${l}${l:+,}${v}";done;echo "$l"
としても可。
666デフォルトの名無しさん
2019/08/08(木) 15:33:36.84ID:PTwvjoI/ いけね、x と z で挟むの忘れてたわ
$ l=;for v;do l="${l}${l:+,}x${v}z";done;echo "$l"
$ l=;for v;do l="${l}${l:+,}x${v}z";done;echo "$l"
667デフォルトの名無しさん
2019/08/08(木) 18:25:37.21ID:cY5mPUh7 >>660や
これを1まとめの変数にする方法ってあるか?
bash test.sh a b c d
って打つと↓を変数で使えるようにしたい(最後だけ,を外して)
xaz,xbz,xcz,xdz
ループさせて配列に入れて${test[@]}でxaz,xbz,xcz,xdz,
って出力させることならできたけど最後の,が邪魔で仕方ない
これを1まとめの変数にする方法ってあるか?
bash test.sh a b c d
って打つと↓を変数で使えるようにしたい(最後だけ,を外して)
xaz,xbz,xcz,xdz
ループさせて配列に入れて${test[@]}でxaz,xbz,xcz,xdz,
って出力させることならできたけど最後の,が邪魔で仕方ない
668デフォルトの名無しさん
2019/08/08(木) 18:27:40.23ID:l7k6B2kQ > これを1まとめの変数にする方法ってあるか?
あるに決まってるだろ。
自分でやり方を模索しろや
> 最後の,が邪魔で仕方ない
ならつかないようにするか消せばいいだけだろ
あるに決まってるだろ。
自分でやり方を模索しろや
> 最後の,が邪魔で仕方ない
ならつかないようにするか消せばいいだけだろ
669デフォルトの名無しさん
2019/08/08(木) 18:31:34.31ID:l7k6B2kQ シェルスクリプト特有のテクニックがわからないならともかく
常識的なやり方すら見いだせないなら適性無いで
常識的なやり方すら見いだせないなら適性無いで
670デフォルトの名無しさん
2019/08/08(木) 18:37:00.79ID:cY5mPUh7 マウント上等!教えてくれ!
${test[@]%,*}でいけると思ったが、これって配列じゃ無理なんか
悔しいねぇw
${test[@]%,*}でいけると思ったが、これって配列じゃ無理なんか
悔しいねぇw
671デフォルトの名無しさん
2019/08/08(木) 18:38:11.84ID:l7k6B2kQ 誰かが教えてやってるやろ
672デフォルトの名無しさん
2019/08/08(木) 18:38:45.45ID:10jj0QOT673デフォルトの名無しさん
2019/08/08(木) 18:39:41.22ID:l7k6B2kQ おいおい。IDみろよ。俺は重大な落とし穴があるで
教えんけどなー。みたいなことは言わない。
教えんけどなー。みたいなことは言わない。
674デフォルトの名無しさん
2019/08/08(木) 18:41:43.33ID:10jj0QOT >>667
$ cat ./test.sh
eval -- "var=$(printf 'x%sz,' $@ | sed -e 's/,$//')"
echo $var
$ bash ./test.sh a b c d
xaz,xbz,xcz,xdz
どうぞ。
$ cat ./test.sh
eval -- "var=$(printf 'x%sz,' $@ | sed -e 's/,$//')"
echo $var
$ bash ./test.sh a b c d
xaz,xbz,xcz,xdz
どうぞ。
675デフォルトの名無しさん
2019/08/08(木) 18:42:02.61ID:zA0vFDSV シェルスクリプトにこだわっても意味内
単なる自己満足
単なる自己満足
676デフォルトの名無しさん
2019/08/08(木) 18:43:40.32ID:l7k6B2kQ >>674
evalいらねーだろ。その程度でいーばるーなよw
evalいらねーだろ。その程度でいーばるーなよw
677デフォルトの名無しさん
2019/08/08(木) 18:47:18.20ID:l7k6B2kQ あと、eval の -- は POSIX準拠じゃない。 dashではエラーになるな。
678デフォルトの名無しさん
2019/08/08(木) 18:49:50.48ID:l7k6B2kQ それと $@(と$var)にダブルクォートがついてないのもマイナス点だな
679デフォルトの名無しさん
2019/08/08(木) 18:52:26.35ID:PTwvjoI/ >>674
$ bash ./test.sh a "b c" d
xaz,xbz,xcz,xdz
となってしまうので、
var=$(printf 'x%sz,' "$@" | sed -e 's/,$//')
か
var=$(printf 'x%sz,' "$@" | head -c -1)
$ bash ./test.sh a "b c" d
xaz,xbz,xcz,xdz
となってしまうので、
var=$(printf 'x%sz,' "$@" | sed -e 's/,$//')
か
var=$(printf 'x%sz,' "$@" | head -c -1)
680デフォルトの名無しさん
2019/08/08(木) 18:59:43.93ID:X/CTiqlR 多分配列つめこんで paste で糊付けしてくれる
paste はいわゆる join()のはず
paste はいわゆる join()のはず
681デフォルトの名無しさん
2019/08/08(木) 18:59:47.03ID:l7k6B2kQ sed呼び出すぐらいならParameter expansionを使ったほうが楽で速いだろう
682デフォルトの名無しさん
2019/08/08(木) 19:04:50.27ID:cY5mPUh7 お前らありがとう
want="$(IFS=,; echo "${test[*]}"}"
ってやったら求めるものが出せた
want="$(IFS=,; echo "${test[*]}"}"
ってやったら求めるものが出せた
683デフォルトの名無しさん
2019/08/08(木) 19:09:09.68ID:10jj0QOT >>677
bash前提のスクリプトなんですがそれは
bash前提のスクリプトなんですがそれは
684デフォルトの名無しさん
2019/08/08(木) 19:09:41.31ID:l7k6B2kQ カッコの対応がおかしい。
サブシェルに入れる理由がないわけじゃないが、これで処理終了なら遅くなるだけ
この程度でbash依存するのは無駄。長くなってるだけ
サブシェルに入れる理由がないわけじゃないが、これで処理終了なら遅くなるだけ
この程度でbash依存するのは無駄。長くなってるだけ
685デフォルトの名無しさん
2019/08/08(木) 19:11:29.10ID:l7k6B2kQ >>683
じゃあbash 2.05aとそれ以前でエラーになると言っておこう
じゃあbash 2.05aとそれ以前でエラーになると言っておこう
686デフォルトの名無しさん
2019/08/08(木) 19:14:12.37ID:l7k6B2kQ ${l}${l:+,} は俺もよく使うが、ループで毎回比較処理をすることになるし、
最後に末尾処理をしたほうが、速いんじゃないかなーって
常々思ってしまう。lが二回出てくるから1行が長くなることが多いし
最後に末尾処理をしたほうが、速いんじゃないかなーって
常々思ってしまう。lが二回出てくるから1行が長くなることが多いし
687デフォルトの名無しさん
2019/08/08(木) 19:53:16.22ID:l7k6B2kQ 試してみたけどやっぱりだ。最後に末尾処理するほうが速い。
dashやkshだと2倍ぐらい差が出る。
bashやzshはこういう処理が何故か遅くて差もあまり出ないけど
dashやkshだと2倍ぐらい差が出る。
bashやzshはこういう処理が何故か遅くて差もあまり出ないけど
688デフォルトの名無しさん
2019/08/08(木) 22:21:10.86ID:HFY26hHh へんなこだわりだな
689デフォルトの名無しさん
2019/08/08(木) 22:27:17.98ID:/tBUMiMq Ruby では、Array#join で自動的に、最後の区切り文字を削除してくれる
ary = [ "a", "b" ]
p ary.join( "," )
#=> "a,b"
ary = [ "a", "b" ]
p ary.join( "," )
#=> "a,b"
690デフォルトの名無しさん
2019/08/08(木) 22:40:09.53ID:X/CTiqlR そりゃそうだ joinは配列から文字列に変換するときに
間の糊付けをしてくれるのだから
間の糊付けをしてくれるのだから
691デフォルトの名無しさん
2019/08/08(木) 23:05:36.97ID:PTwvjoI/ 単純な join でセパレータが一文字なら定番の
$ (IFS=,; echo "$*")
で良いのだろうけど
$ (IFS=,; echo "$*")
で良いのだろうけど
692デフォルトの名無しさん
2019/08/09(金) 01:09:56.64ID:err5h/zJ 無自覚なバカってほんと厄介だな
693デフォルトの名無しさん
2019/08/09(金) 01:22:55.05ID:sB3SWfXZ694デフォルトの名無しさん
2019/08/09(金) 01:27:47.18ID:sB3SWfXZ >>691で
> 単純な join でセパレータが一文字なら
という話が出たので、問題。
今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが
それでもIFS=,を使うならばどうすればよいだろうか?
言い換えると、引き数 a b c を xaz xbz xcz にすればいいわけだが、
さてどうすればよいだろうか?
> 単純な join でセパレータが一文字なら
という話が出たので、問題。
今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが
それでもIFS=,を使うならばどうすればよいだろうか?
言い換えると、引き数 a b c を xaz xbz xcz にすればいいわけだが、
さてどうすればよいだろうか?
695デフォルトの名無しさん
2019/08/09(金) 02:31:44.47ID:oVYwNj0v そんな面倒なことをシェルスクリプトでやるのはやめる
客が7&いじゃなければ大丈夫だろ
客が7&いじゃなければ大丈夫だろ
696デフォルトの名無しさん
2019/08/09(金) 02:45:58.64ID:err5h/zJ 日本語崩壊してて草
697デフォルトの名無しさん
2019/08/09(金) 03:00:09.73ID:tip6m9df >>667
$ var=$(printf "x${1}z";shift;(($#)) && printf ',%sz' "${@/#/x}")
$ var=$(printf "x${1}z";shift;(($#)) && printf ',%sz' "${@/#/x}")
698デフォルトの名無しさん
2019/08/09(金) 03:18:20.23ID:tip6m9df >>694
$ (set -- "${@/#/x}";set -- "${@/%/z}";IFS=,;echo "$*")
$ (set -- "${@/#/x}";set -- "${@/%/z}";IFS=,;echo "$*")
699デフォルトの名無しさん
2019/08/09(金) 03:22:06.84ID:sB3SWfXZ >>697
とっても無理矢理感があるなw
まず引き数がないときに、xzと表示されるバグが有る。
あと後半意味がわからんw
単純に && printf ',x%sz' "$@" でいいんでないの?
(($#))もいらんし
とっても無理矢理感があるなw
まず引き数がないときに、xzと表示されるバグが有る。
あと後半意味がわからんw
単純に && printf ',x%sz' "$@" でいいんでないの?
(($#))もいらんし
700デフォルトの名無しさん
2019/08/09(金) 03:25:55.01ID:sB3SWfXZ701デフォルトの名無しさん
2019/08/09(金) 03:43:31.73ID:tip6m9df >>699
shift 後の $# が 0 以上だと成功になってしまうので引数が1個の場合、
$ set -- a
$ var=$(printf "x${1}z";shift&&printf ',%sz' "${@/#/x}")
$ echo "$var"
xaz,z
となってしまう。
一応、引数は1個以上を想定して、2個以上なら (($#))&& は不要なんだけどね
引数なしでも処理するなら、もっと酷くなるw
var=$((($#))&&{ printf "x${1}z";shift;(($#))&&printf ',%sz' "${@/#/x}"; })
shift 後の $# が 0 以上だと成功になってしまうので引数が1個の場合、
$ set -- a
$ var=$(printf "x${1}z";shift&&printf ',%sz' "${@/#/x}")
$ echo "$var"
xaz,z
となってしまう。
一応、引数は1個以上を想定して、2個以上なら (($#))&& は不要なんだけどね
引数なしでも処理するなら、もっと酷くなるw
var=$((($#))&&{ printf "x${1}z";shift;(($#))&&printf ',%sz' "${@/#/x}"; })
702デフォルトの名無しさん
2019/08/09(金) 03:46:25.07ID:tip6m9df おっと、
var=$((($#))&&{ printf "x${1}z";shift;(($#))&&printf ',x%sz' "$@"; })
だね
var=$((($#))&&{ printf "x${1}z";shift;(($#))&&printf ',x%sz' "$@"; })
だね
703デフォルトの名無しさん
2019/08/09(金) 03:55:40.01ID:sB3SWfXZ ああprintfは引き数がない場合でも表示されるのか
704デフォルトの名無しさん
2019/08/09(金) 04:24:13.39ID:err5h/zJ >>673
仮に別人だとしても同じようなことしてるぞ。
自分で模索しろとか言って解法を提示していないにもかかわらず
ある程度要求を満たす解法が上がった瞬間それにケチ付けはじめてるじゃん。
もしもほんとうに「自分で模索しろ」って思ってんなら黙っときゃいい話。
わざわざ人が答えを述べてからそれに乗っかるなんてマネする必要ない。
仮に別人だとしても同じようなことしてるぞ。
自分で模索しろとか言って解法を提示していないにもかかわらず
ある程度要求を満たす解法が上がった瞬間それにケチ付けはじめてるじゃん。
もしもほんとうに「自分で模索しろ」って思ってんなら黙っときゃいい話。
わざわざ人が答えを述べてからそれに乗っかるなんてマネする必要ない。
705デフォルトの名無しさん
2019/08/09(金) 04:28:32.89ID:err5h/zJ >>700
このコマンドラインをPOSIXに準じたものにするには
(愚直に言えば)単に${VAR/aaa/bbb}をprintf '%s' "$VAR" | sed -e 's/aaa/bbb/'
に変えればいいだけでは?
それかPOSIXの範疇で変数の置換展開を実現する方法を訊いているのか?
それじゃあ多分無理だ。
このコマンドラインをPOSIXに準じたものにするには
(愚直に言えば)単に${VAR/aaa/bbb}をprintf '%s' "$VAR" | sed -e 's/aaa/bbb/'
に変えればいいだけでは?
それかPOSIXの範疇で変数の置換展開を実現する方法を訊いているのか?
それじゃあ多分無理だ。
706デフォルトの名無しさん
2019/08/09(金) 04:30:09.25ID:err5h/zJ まあ尤もprintf sedなんていちいち呼び出すなんてバカなマネは普通しないが。
707デフォルトの名無しさん
2019/08/09(金) 04:35:02.69ID:sB3SWfXZ708デフォルトの名無しさん
2019/08/09(金) 04:36:42.97ID:sB3SWfXZ このテクニックはいろいろと応用が効くのだ!キリッ!
709デフォルトの名無しさん
2019/08/09(金) 04:39:32.46ID:yPcnAt2h shiftを上手く使えば
N番目以降の引数だけ別の処理に使うことってできるよね?
あとbashの引数って10超えるとおかしくなるってマジ?
N番目以降の引数だけ別の処理に使うことってできるよね?
あとbashの引数って10超えるとおかしくなるってマジ?
710デフォルトの名無しさん
2019/08/09(金) 04:40:03.48ID:yPcnAt2h 10超えると→10個以上引数持たせると
711デフォルトの名無しさん
2019/08/09(金) 04:40:29.97ID:sB3SWfXZ712デフォルトの名無しさん
2019/08/09(金) 04:44:59.16ID:sB3SWfXZ 引数をうまく扱うにはshift、
引数を高度に扱うにはevalを使う
引数を高度に扱うにはevalを使う
713デフォルトの名無しさん
2019/08/09(金) 05:33:56.10ID:err5h/zJ714デフォルトの名無しさん
2019/08/09(金) 16:11:09.79ID:R8nkiB91 awkとか使ってtsvを別のtsvに挿入させる方法ってある?
hoge.tsv
a b e
1 2 5
huga.tsv
c d
3 4
↓
hoge_huga.tsv
a b c d e
1 2 3 4 5
みたいな
hoge.tsv
a b e
1 2 5
huga.tsv
c d
3 4
↓
hoge_huga.tsv
a b c d e
1 2 3 4 5
みたいな
715デフォルトの名無しさん
2019/08/09(金) 17:22:23.99ID:tip6m9df 行と列をひっくり返す transpose っていう awk script を作って、
========
#!/usr/bin/awk -f
{for(i=1;i<=NF;i++) a[NR,i]=$i}
END{
for(j=1;j<=NF;j++) {
str=a[1,j]
for(i=2;i<=NR;i++) str=str" "a[i,j]
print str
}
}
========
$ paste hoge.tsv huga.tsv | ./transpose | sort -k1,1 | ./transpose
a b c d e
1 2 3 4 5
========
#!/usr/bin/awk -f
{for(i=1;i<=NF;i++) a[NR,i]=$i}
END{
for(j=1;j<=NF;j++) {
str=a[1,j]
for(i=2;i<=NR;i++) str=str" "a[i,j]
print str
}
}
========
$ paste hoge.tsv huga.tsv | ./transpose | sort -k1,1 | ./transpose
a b c d e
1 2 3 4 5
716デフォルトの名無しさん
2019/08/09(金) 17:43:24.97ID:UutwPLbs717デフォルトの名無しさん
2019/08/09(金) 18:18:03.48ID:err5h/zJ >>715
こっちのやりかたのほうが汎用的だし個人的には好きかな。
こっちのやりかたのほうが汎用的だし個人的には好きかな。
718デフォルトの名無しさん
2019/08/09(金) 18:25:29.43ID:UutwPLbs (´-`).。oO(列の挿入なのに何故ソートするんだろう)
719デフォルトの名無しさん
2019/08/09(金) 18:26:02.71ID:X5pM/Zqg >>716
awkのところcutでやろうとして失敗してる質問stackoverflowにたくさんあるね。
何度も提案されたが全部リジェクトされたんだとか。
https://stackoverflow.com/questions/1037171/forcing-the-order-of-output-fields-from-cut-command/#answer-1037260
awkのところcutでやろうとして失敗してる質問stackoverflowにたくさんあるね。
何度も提案されたが全部リジェクトされたんだとか。
https://stackoverflow.com/questions/1037171/forcing-the-order-of-output-fields-from-cut-command/#answer-1037260
720デフォルトの名無しさん
2019/08/09(金) 18:42:56.05ID:xLAwVgGE む。出遅れたか。気づいていたんだが書き込む時間がなかった。
>>716 と近いが、tsvなら入力をタブ文字にしたほうが良いだろう
でないとスペースまで区切りとして扱われる
paste hoge.tsv huga.tsv | awk -F"\t" -v OFS="\t" '{print $1,$2,$4,$5,$3}'
>>716 と近いが、tsvなら入力をタブ文字にしたほうが良いだろう
でないとスペースまで区切りとして扱われる
paste hoge.tsv huga.tsv | awk -F"\t" -v OFS="\t" '{print $1,$2,$4,$5,$3}'
721デフォルトの名無しさん
2019/08/09(金) 18:45:10.20ID:xLAwVgGE722デフォルトの名無しさん
2019/08/09(金) 18:48:55.70ID:xLAwVgGE >>713
その答えもありだが、それはそれとして
引き数の a b c を xaz xbz xcz にするPOSIX準拠のテクニックって
あまり知られてないのか?
まさかこんなに出ないとは思わなかった。
その答えもありだが、それはそれとして
引き数の a b c を xaz xbz xcz にするPOSIX準拠のテクニックって
あまり知られてないのか?
まさかこんなに出ないとは思わなかった。
723デフォルトの名無しさん
2019/08/09(金) 19:01:27.20ID:xLAwVgGE 同時に二つのファイルを開くやり方も分かったことだし、
ついでにシェルスクリプトだけで実現するやり方を書いておこう
#!/bin/sh
exec 3<./hoge.tsv
exec 4<./huga.tsv
IFS=$(printf '\t')
until
eof=1
read -r col1 col2 col3 <&3 && eof=''
read -r col4 col5 <&4 && eof=''
[ "$eof" ]
do
set -- "$col1" "$col2" "$col4" "$col5" "$col3"
echo "$*"
done
ついでにシェルスクリプトだけで実現するやり方を書いておこう
#!/bin/sh
exec 3<./hoge.tsv
exec 4<./huga.tsv
IFS=$(printf '\t')
until
eof=1
read -r col1 col2 col3 <&3 && eof=''
read -r col4 col5 <&4 && eof=''
[ "$eof" ]
do
set -- "$col1" "$col2" "$col4" "$col5" "$col3"
echo "$*"
done
724デフォルトの名無しさん
2019/08/09(金) 19:03:15.21ID:R8nkiB91725デフォルトの名無しさん
2019/08/09(金) 19:04:32.76ID:xLAwVgGE >>724
また、てめぇぇぇぇか!
また、てめぇぇぇぇか!
726デフォルトの名無しさん
2019/08/09(金) 19:10:00.87ID:X5pM/Zqg GNU datamashってのがあんだね。
$ paste hoge.tsv huga.tsv | datamash transpose | sort | datamash transpose
とか。挿入じゃなくてソートだけど。
$ paste hoge.tsv huga.tsv | datamash transpose | sort | datamash transpose
とか。挿入じゃなくてソートだけど。
727デフォルトの名無しさん
2019/08/09(金) 19:14:10.02ID:tip6m9df ソートしたのは >>714 で hoge.tsv と huga.tsv の一行目の項目が辞書順に
並ぶ様に挿入する、って思ったんだよね
並ぶ様に挿入する、って思ったんだよね
728デフォルトの名無しさん
2019/08/09(金) 19:21:09.66ID:UutwPLbs >>720
FSのデフォルトはスペースとタブだから指定する必要ないよ
FSのデフォルトはスペースとタブだから指定する必要ないよ
729デフォルトの名無しさん
2019/08/09(金) 19:21:36.74ID:err5h/zJ なんかこのスレに書き込む質問者ってお客は神様だみたいな発想してる人多い印象がある。
多少の問題は自力で解決しろよって思うわ。
「その例"だけ"に〜」とか喚いてるけど,その「例」とやらがマズい例なのでは?とは1ミリも考えてなさそう。
いつも自分が正しい。問題の責任は他人にある。
まあスレの全員がそうじゃないけどね。極一部。
多少の問題は自力で解決しろよって思うわ。
「その例"だけ"に〜」とか喚いてるけど,その「例」とやらがマズい例なのでは?とは1ミリも考えてなさそう。
いつも自分が正しい。問題の責任は他人にある。
まあスレの全員がそうじゃないけどね。極一部。
730デフォルトの名無しさん
2019/08/09(金) 19:21:58.99ID:UutwPLbs731デフォルトの名無しさん
2019/08/09(金) 19:22:34.09ID:xLAwVgGE >>728
アホか、スペースとタブだからタブだけにするんやろw
アホか、スペースとタブだからタブだけにするんやろw
732デフォルトの名無しさん
2019/08/09(金) 19:25:33.15ID:xLAwVgGE733デフォルトの名無しさん
2019/08/09(金) 19:27:56.83ID:UutwPLbs (´-`).。oO(勘違いしたって言ってるんだからもうええやん)
734デフォルトの名無しさん
2019/08/09(金) 19:28:06.46ID:xLAwVgGE735デフォルトの名無しさん
2019/08/09(金) 19:29:12.17ID:xLAwVgGE >>733
スレ更新してから書き込むまでに、34秒以上かかっただけだよw
スレ更新してから書き込むまでに、34秒以上かかっただけだよw
736デフォルトの名無しさん
2019/08/09(金) 19:33:01.55ID:OjVO+GBn 主気取り
737デフォルトの名無しさん
2019/08/09(金) 19:34:19.38ID:xLAwVgGE しゅ‐き【主気】
?名? そのものがいつも持っている運気。⇔客気(かっき)。〔夢渓筆談‐象数・一〕
?名? そのものがいつも持っている運気。⇔客気(かっき)。〔夢渓筆談‐象数・一〕
738デフォルトの名無しさん
2019/08/10(土) 00:01:07.05ID:L+B8OP2P はい、24:00締め切りでーす。
> 引き数 a b c を xaz xbz xcz にすればいいわけだが、
> さてどうすればよいだろうか?
解答
for i in "$@"; do
set -- "$@" "x${i}z"
shift
done
> 引き数 a b c を xaz xbz xcz にすればいいわけだが、
> さてどうすればよいだろうか?
解答
for i in "$@"; do
set -- "$@" "x${i}z"
shift
done
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- こども家庭庁、2026年から“独身税”を開始、年収200万なら年4200円、年収400万なら年7800円 [お断り★]
- こども家庭庁、2026年から“独身税”を開始、年収200万なら年4200円、年収400万なら年7800円 ★2 [お断り★]
- 鈴木農相「おこめ券はお米しか買えないわけではない。例えば卵、味噌、しょうゆ、こうした購入に利用可能」 ★3 [Hitzeschleier★]
- 山里亮太、フィリピンに子ども食堂を建設 「偽善者」「日本の子どもを助けるべき」の声があっても活動を続ける理由 [Anonymous★]
- サナエノミクスについて力説 積極的な財政出動で「所得増える 消費マインド上がる 税収増える」片山さつき財務大臣 [少考さん★]
- 【芸能】粗品 「間違ったお笑いの常識が放送されている」「テレビ見てる素人って、笑い声でしか面白いかどうか判断できない。可哀想」 [冬月記者★]
- デフレ、円高👈こいつが叩かれた理由 [943688309]
- ( ・᷄ὢ・᷅ )博士ってイヤイヤ言っててもパンツ脱がす時には自然と腰を浮かせてきそう
- 残クレ自転車 チャリファード
- 【悲報】ココナッツサブレ、なぜか売り切れ続出する🤔 [733893279]
- みんな 高速道路って使ってるの?
- 「甲鉄城のカバネリ」ってなん出過小評価されてるの? [155047642]
