2011-10-25 2 views
2

圧縮されていない行数と列数は同じです。複数の.gzファイルの特定の列を一緒に貼り付けます。

すべてのファイルは同じディレクトリにあります。

すべてのファイルから5〜6列ごとに引き出し、一時ファイルをダンプしなくても一緒に貼り付けることはできますか?あなたは一時ファイルを避けるために、bashのプロセス置換を評価し、使用するコマンドラインを作成することができます

for i in *.gz 
do 
    gunzip -c $i |cut -f5-6 >$i.tmp; 
done 

paste *.tmp 

おかげ

答えて

5

よう

何か:

command=paste 
for i in *.gz; do 
    command="$command <(gzip -cd $i | cut -f5-6)" 
done 
eval $command 
+0

実に興味深い方法でありますそれをするために。ファイルの数が多すぎない限り(複数のプロセスとファイルごとに少数のファイル記述子を使用している限り)、うまく動作するはずです。また、$ iで引用することに注意してください。 – derobert

1
for f in *.gz ; do 
    printf '_fn %s\n' "$f" 
    gunzip -c "$f" 
done | 
    awk 'END { 
    for (i = 0; ++i <= m;) 
     for (j = 0; ++j <= fc;) 
     printf "%s", (d[j, i] (j < fc ? OFS : RS))  
    } 
    $1 == "_fn" { 
    fn = $2; fnr = x; ++fc 
    next 
    } 
    { 
    d[fc, ++fnr] = $5 OFS $6 
    fnr > m && m = fnr 
    }' OFS='\t' 
+0

偉大な仕事...私はawkをよく知っていませんが、やっと私はそれを解決しました。私にとって良い学習経験(私はawkをもっと良く知っています:)感謝...唯一の制限は、出力ファイルのサイズに相対的なパーセンテージオーバヘッド配列の構造...私はそれが好きです:) ...実際に+1、** + **いくつかの精神:) –

関連する問題