2011-06-17 18 views
0

2つのタブ区切りファイルがあります。2つのファイルのデータ比較

ファイル1(10行及び4列は、これらの列は、各列に充填されないことがあり言う):

Chra stra stpa NM1 NM2 NR1 
Chrb strb stpb NR2 NM1 

ファイル2(25行3列):今

Tg NM1 12 
Tg NM3 3 
Tg NR1 76 

私がやりたいことは、現在のファイル1のNMとNRの識別子をファイル2のNR識別子が一致するファイル2i fと比較することです。それはこのように見えるかもしれファイル2

ファイル3からNR/NM識別子の対応する値を抽出する必要があります(NM1のために言う):シェルスクリプトの

chra stra stpa NM1 12 
chra stra stpa NR1 76 

任意の提案ですか?

+0

可能重複 - http://stackoverflow.com/questions/6385609/unix-shell-replace-by-dictionary – ajreal

+0

でこのファイル1の列数は各行に固定されていません... – Angelo

答えて

0

シェルスクリプトではなく、Perlスクリプトでこのようなことをしています。 split()関数を使用して、各行のすべての「フィールド」を持つ配列を取得できます。そこから下り坂になります。上品な正規表現を考える必要はありません。 Hereの この種のものを行うための例は:この

2
$ join -1 4 -2 2 \ 
<(for i in 4 5 6 7; do join -e _ -j $i f1 f1 -o 1.1,1.2,1.3,0; done | 
    sed '/_$/d' | sort -k4,4) \ 
<(sort -k2,2 f2) \ 
-o 1.1,1.2,1.3,0,2.3 

Chra stra stpa NM1 12 
Chrb strb stpb NM1 12 
Chra stra stpa NR1 76 
0
awk ' 
    NR == FNR {tag[$2] = $3; next} 
    { 
     # determine if this line has a "NR" tag from file2 
     have_nr = 0 
     for (i=4; i<=NF; i++) { 
      if ($i ~ /^NR/ && $i in tag) { 
       have_nr = 1 
       break 
      } 
     } 

     # if it does have a matching NR tag, then 
     # print the tag value for every matching NR/NM tag 
     if (have_nr) { 
      for (i=4; i<=NF; i++) { 
       if ($i in tag) { 
        print $1, $2, $3, $i, tag[$i] 
       } 
      } 
     } 
    } 

' file2 file1 
関連する問題