grepで遊びます。
ファイル名と行番号だけのgrepリストを作り、そのリストから該当箇所を抽出します。
元ファイルは、いつもの英単語リスト使います。
takk@deb9:~/tmp$ shuf /usr/share/dict/words | head -1000 | split -dl100 takk@deb9:~/tmp$ ls x00 x01 x02 x03 x04 x05 x06 x07 x08 x09 takk@deb9:~/tmp$
こうすると、ファイルx00~x09にランダムな英単語が100個できます。適当な単語を指定してgrep。
takk@deb9:~/tmp$ grep ^app * x02:applesauce's x03:appeaser takk@deb9:~/tmp$
オプションつけないと、ファイル名と見つかった行が表示されますね。
-nオプションで行番号。
takk@deb9:~/tmp$ grep -n rr * x00:40:parrakeet x00:72:barraged x00:87:parrakeets x01:25:irritatingly x01:32:deterring x01:36:borrowed x02:27:irresistible x02:60:surrounds x02:92:harried x04:17:Barr's x05:11:guerrilla's x05:16:Lorraine's x05:23:irregularity's x05:60:surrealism's x05:87:Corrine x06:52:diarrhoea's x07:14:scarred x09:16:stirrer's x09:57:barren x09:87:Barrie's takk@deb9:~/tmp$
ファイル名と行番号だけにするため、cutでcut。
takk@deb9:~/tmp$ grep -n rr * | cut -d: -f1,2 | tee list x00:40 x00:72 x00:87 x01:25 x01:32 x01:36 x02:27 x02:60 x02:92 x04:17 x05:11 x05:16 x05:23 x05:60 x05:87 x06:52 x07:14 x09:16 x09:57 x09:87 takk@deb9:~/tmp$
ファイル名と行番号のリストされたlistファイルを作成しました。
次はこのlistファイルのファイル名、行番号の一覧から、該当行を抽出。
takk@deb9:~/tmp$ perl -ne 'chomp; ($file,$no)=split /:/,$_;$cmd= "sed -ne " . $no . "p " . $file;system($cmd)' list parrakeet barraged parrakeets irritatingly deterring borrowed irresistible surrounds harried Barr's guerrilla's Lorraine's irregularity's surrealism's Corrine diarrhoea's scarred stirrer's barren Barrie's takk@deb9:~/tmp$
思い通りにテキスト整形できると、日常のお仕事はものすごくはかどります。
でも、あまりきれいではないコマンド連携。簡潔なワンライナー書けるようになるのはいつの日か。
コメント