- 締切済み
複雑なテキストファイルのソート方法
UNIX上で以下の様なテキストファイルがあります。 1 subckt keyword1 2 : 3 ends keyword1 4 subckt keyword2 5 : 6 ends keyword2 7 subckt keyword3 8 : 9 ends keyword3 10 M0(net1 net2 net3 net4) keyword4 11 M1(net5 net6 net7 net8) keyword5 subckt~endsはひとつのブロックです。(よって、1~3、4~6、7~9はひとつのブロックとしてあつかいます。) ブロックとしての記述と10、11行目のように1行で記述されたものが混在しているファイルです。 この様なフォーマットのファイルをサンプルのテキストファイルで記述されているkeywordでソートしたいのですが いい方法はないでしょうか? ブロックとして記述されている部分をばらけさせると意味がないのでブロックで記述されている部分はブロック毎 ソートしないと意味がありません。 スクリプトのようなものを組むしかないようにも思うのですが、いい方法が思いつきません。 どなたか御指南お願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Wap58
- ベストアンサー率33% (29/87)
perlです、keywordの目印が何かわからないけど 番号で配列に書き込めばいいんでないの 連番じゃないと警告でます、#use warningsにして keywaord0にはつかえないし全角数字もダメ use strict; use warnings; my $count; my @an; $an[0] =''; my $i; open KK,'fukuzatu.txt'; while(<KK>){ $count = 3 if $_ =~ m[^\d+subckt.+keyword(.+)]; $i = $1 if $1; if($count){ $an[$i] .= $_; $count--; next; } $an[$1] = $_ if $_ =~m[keyword(.+)]; } close KK; print"@an";
- trapezium
- ベストアンサー率62% (276/442)
こうですかね。#1 さんのほぼそのまま実装してみました。GNU sed 前提です。 sed -E '/^[0-9]+subckt\>/{:1;N;/\n[0-9]+ends\>/!b1}; h;s/^.*[ \t ]+//;G;y/\n/\v/;' textfile | sort | sed 's/^[^\v]*\v//; y/\v/\n/;'
- M_Sato
- ベストアンサー率54% (550/1003)
わたしはUNIXは使ったことがないのですが、 sed(ストリーム・エディタ)とsortコマンドを組み合わせれば可能なのではないでしょうか。 1行の中の項目の区切りがどのようになっているか(タブ区切り?)わからないので、あいまいな説明になりますが (1)行の連結(sedで) subckt~endsまでをつなげてひとつの行にする。 その際、行の区切りにデータ中には出現しないコード(たとえばエスケープコード\eとする)を入れて目印にし、 行末のkeywordを行頭にコピーする (2)1行だけのデータは行末のkeywordを行頭にコピーする (3)sortコマンドでソートを実行 (4)行頭のキーワードを削除し、エスケープコード\eを改行コード\nに置換する(sedで)