シェルスクリプト総合 その30
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/ 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
みたいな 行と列をひっくり返す 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 >>714
paste hoge.tsv huga.tsv | awk 'BEGIN{OFS="\t"}{print $1,$2,$4,$5,$3}'
a b c d e
1 2 3 4 5 >>715
こっちのやりかたのほうが汎用的だし個人的には好きかな。 (´-`).。oO(列の挿入なのに何故ソートするんだろう) む。出遅れたか。気づいていたんだが書き込む時間がなかった。
>>716 と近いが、tsvなら入力をタブ文字にしたほうが良いだろう
でないとスペースまで区切りとして扱われる
paste hoge.tsv huga.tsv | awk -F"\t" -v OFS="\t" '{print $1,$2,$4,$5,$3}' >>718
それな。いかにも要求されてないことをやってるだろw
このスレ、例を出すと、その例を"だけ"に通用するコード書くやつ多いぞ
それを訂正するのに労力がかかるって言った意味わかるやろ? >>713
その答えもありだが、それはそれとして
引き数の a b c を xaz xbz xcz にするPOSIX準拠のテクニックって
あまり知られてないのか?
まさかこんなに出ないとは思わなかった。 同時に二つのファイルを開くやり方も分かったことだし、
ついでにシェルスクリプトだけで実現するやり方を書いておこう
#!/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 >>720
おおおおおおありがてぇ!
区切りもタブ指定しないとyyyy-mm-dd hh-mm-ssとかがずれるよね GNU datamashってのがあんだね。
$ paste hoge.tsv huga.tsv | datamash transpose | sort | datamash transpose
とか。挿入じゃなくてソートだけど。 ソートしたのは >>714 で hoge.tsv と huga.tsv の一行目の項目が辞書順に
並ぶ様に挿入する、って思ったんだよね >>720
FSのデフォルトはスペースとタブだから指定する必要ないよ なんかこのスレに書き込む質問者ってお客は神様だみたいな発想してる人多い印象がある。
多少の問題は自力で解決しろよって思うわ。
「その例"だけ"に〜」とか喚いてるけど,その「例」とやらがマズい例なのでは?とは1ミリも考えてなさそう。
いつも自分が正しい。問題の責任は他人にある。
まあスレの全員がそうじゃないけどね。極一部。 >>728
アホか、スペースとタブだからタブだけにするんやろw >>729
例っつーのはな、本題があって、それを補足するためのものなんだよ。
本題が本当にやりたいこと、
お前>>714本題の文章「awkとか使ってtsvを別のtsvに挿入させる方法ってある?」
読んで、ソートしたいって思うか?
お前は「いつも自分の解答が正しい。問題の責任は質問した他人にある。」
と考えてるんやろ? ■ このスレッドは過去ログ倉庫に格納されています