超、初心者です。よろしくお願いします。
やりたい操作は2つあります。
1:2つのディレクトリには各30個のファイルがあり、この2つのディレクトリを比較して、同じ名前のファイルを取り出す。
2:同じ名前のファイルをmargeし、新しいファイルとして新しいディレクトリに書き出す
2つのファイルをmargeするには、unixのコマンドのzcat(圧縮ファイルです。)を使用するとできそうです。
例 zcat fileA.fastq fileB.fastq >fileC.fastq
「別々のディレクトリから同じ名前のファイルを取り出す」というスクリプトが書けません(これはperlを使用したら良いのかなと思います)。また、zcat(Unixのコマンドと)とどのように組み合わせたら良いのか悩んでします。良いアイデア、スクリプトの書き方を教えていただければと思います。よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
1:2つのディレクトリには各30個のファイルがあり、この2つのディレクトリを比較して、同じ名前のファイルを取り出す。
ファイル名に改行を含んでいたりするとダメですが comm
コマンドでできます。
comm -12 <(ls aaa/) <(ls bbb/)
例えば次のように片方のディレクトリには 10 から 39 までのフィアル名が、もう片方のディレクトリには 20 から 49 までのファイルがある場合、
mkdir aaa bbb touch aaa/{10..39} touch bbb/{20..49}
両方のディレクトリにある 20 から 39 までのファイル名が表示されます。
comm -12 <(ls aaa/) <(ls bbb/)
comm -23
なら aaa にだけ存在するファイル名が、
comm -23 <(ls aaa/) <(ls bbb/)
comm -13
なら bbb にだけ存在するファイル名が表示されます。
comm -13 <(ls aaa/) <(ls bbb/)
投稿2015/05/29 11:27
総合スコア4514
0
ベストアンサー
Perlではないですが、シェルスクリプト(これはsh
バージョン)でこのようにできます。
マージはテキストファイルを単純に連結する前提です。
lang
1#!/bin/sh 2 3for f in aaa/* 4do 5 name=`basename $f` 6 if [ -f bbb/$name ]; then 7 echo "merge $name" 8 cat aaa/$name bbb/$name > ccc/$name 9 fi 10done
aaa
とbbb
を比較し、マージ結果はccc
に出力します。
for
でaaa
と同じディレクトリーのファイル名の繰り返しを行います。
basename
で名前の部分だけを取り出します。
bbb
にもその名前のファイルがあれば、マージします。
マージは、zcat
でなくcat
を使います。
zcat
は、Compressで圧縮されたファイルを展開して標準出力に流すものです。
投稿2015/05/29 08:50
総合スコア9388
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/01 04:09
2015/06/01 08:03
2015/06/01 08:11
0
上記のPerlを書いたものです。
アルゴリズムがちょっとわかりづらくて混乱させてしまいました。
他の方がシェルでかかれたやり方のほうが、わかりやすいかもしれませんので、
そのPerl版を書きました。(一部systemで横着してます。。)
lang
1#!/usr/bin/perl 2use strict; 3use warnings; 4use File::Basename; 5 6my $dir1="dir1"; 7my $dir2="dir2"; 8my $dir3="dir3"; 9 10for( glob("$dir1/*") ) 11{ 12 my $name=basename($_); 13 if( -f "$dir2/$name" ) { 14 15 my $com = "cat $dir1/$name $dir2/$name > $dir3/$name"; 16 print $com,"\n"; 17 system( $com ); 18 } 19}
投稿2015/06/01 10:17
編集2015/06/01 10:55総合スコア129
0
とりあえず、
「別々のディレクトリから同じ名前のファイルを取り出す」というスクリプト
です。
他にもやり方があるかと思いますが、とりあえずPerlで
my @array = ( glob("dir/"), glob("dir2/") );
のdir, dir2 部分を2つの任意のディレクトリ名で修正してください。
lang
1#!/usr/bin/perl 2use strict; 3use warnings; 4use File::Basename; 5 6my %hash=(); 7 8my @array = ( glob("dir/*"), glob("dir2/*") ); 9 10$hash{ basename($_) }++ for( @array ); 11 12 13while( my ($key, $val) = each %hash ) 14{ 15 print $key,"\n" if( $val == 2 ); 16}
投稿2015/05/29 14:54
編集2015/06/01 10:33総合スコア129
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/01 03:41
2015/06/01 10:11
2015/06/02 04:51
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/01 03:36