2016-03-21 6 views
0

私は2つのテキストファイルを持っています。 「A.TXT」は1つのtxtファイルから価値を得て別のファイルに追加するには?

A 1 AB ... 1 5 -3 4.5 (contains 11 columns. So "4.5" is in the 11th column) 
A 2 BC ... -2 3 8 9.2 
A 3 WE ... 2 3 8 5.2 
A 4 RT ... 23 2 24 4.1 
... 
END 

を含む「B.TXTは」最終2列は「A.TXT」とは異なることを除いて同様です。もう一つの違いは、 "B.txt"には "A.txt"にないいくつかの追加の行が含まれていることです。例えば、第3ラインA 3 QEW ... 5 23 34 5は私がやりたいことA.TXT」の各行の最後の列の値を抽出している「A.TXT」

A 1 AB ... 1 5 4 9 
A 2 BC ... -2 3 1 0 
A 3 QEW ... 5 23 34 5 
A 4 WE ... 2 3 -7 56 
A 5 RT ... 23 2 -5 14 
... 
END 

「B.TXT」にあるがありません"B.txt"の対応する行に追加します。 "A.txt"にない "B.txt"の各行について、3番目の列要素が文字 "Q"(例えばQEW)で始まり、それ以外の場合は値2を追加する場合は値1を追加したい。出力は次のようになります

A 1 AB ... 1 5 4 9 4.5 
A 2 BC ... -2 3 1 0 9.2 
A 3 QEW ... 5 23 34 5 1 
A 4 WE ... 2 3 -7 56 5.2 
A 5 RT ... 23 2 -5 14 4.1 
... 
END 

私は以下のコードを試しましたが、出力は生成されませんでした。私は何か間違っているのですか?

def main(): 
     #enter python code.py A.txt B.txt in command line 
     A = open(sys.argv[1]) 

     AAlist = [] 
     TE = [] 
     i=1 
     for line in A: 
      linestr = ' '.join(line.split()) 
      if linestr[1]==i: 
       AAlist.append(linestr[2]) 
       TE.append(linestr[10]) 
      i+=1 

     BAlist = [] 
     i=0 
     j=0 
     with open(sys.argv[2]) as B, open('outputpy.txt', 'w') as out_file: 
      for line in B: 
       linestr = ' '.join(line.split()) 
       if linestr[1]==j: 
        at = linestr[2] 
        BAlist.append(atm) 
        if at!=AAlist[i]: 
         if at[0]=='Q': 
          out_file.write(1) 
         else: 
          out_file.write(2)    

        #print >> outfile 
        out_file.write(TE[i]) 
        i+=1 
        j+=1 
     print "finished" 

Linuxコマンドを使用して操作する方法はありますか? Pythonコードより簡単ですか?

編集:私は、私が正しくあなたを理解している場合、出力は

+1

ヒント:awkはこの種のものに適しています。 – 3442

+0

2つの行が同じであるかどうかをどのように判断しますか? 「A 3 WE ...」は「A 4 WE ...」と同じですか? – pfnuesel

+0

いいえ3は4と同じではないので「同じ」ではありません。私は質問を編集しましたので、今よりもっと明確になりました – user5739619

答えて

0

どのように見えるかを示した以下のawkのスクリプトは、あなたが欲しいものを行う必要があります。

NR==FNR{ 
    arr[$3] = $11 
    next 
} 
{ 
    if ($3 in arr){ 
     print($0, arr[$3]) 
    }else if ($3 == "^Q"){ 
     print($0, "2") 
    }else{ 
     print($0, "1") 
    } 
} 

が実行それを

awk -f script.awk f1 f2 

NR==FNRは最初のファイルではtrue、それ以外のファイルではfalseとなるため、最初の部分ではこの場合、。 3番目のフィールドのキーで満たされ、11番目のフィールドの値を持ちます。 $3をたとえばと置き換えることができます。 $1$2$3 2番目のファイルの一致が最初の3つのフィールドで完了している場合(質問の下にある私のコメントも参照してください)。

2番目のファイルでは、キーが配列内に見つかった場合は追加します。そうでない場合は、第3フィールドの最初の文字がQであるかどうかを確認します。そうでない場合は2を追加します。それ以外の場合は1を追加します。

+0

私はそれを試してみると、19.3 1 AB ... 1 5 4 9'最初の行では 'A 1 AB ... 1 5 4 9 4.5'となるはずです。 19.3がどこから来たのか分かりません。そして、 '.txt'から' 4.5 'の値が欠落しています。また、どのように出力をtxtファイルに保存するのですか? – user5739619

+0

出力を再現できません。 '> file.out'を追加することでテキストファイルに保存することができます。 – pfnuesel

+0

ok '$ 3'を' $ 1 $ 2 $ 3'に置き換えると、よりうまく動作するようになりました。しかし、各行に '\ n'があるようです。たとえば、最初の行に '19.3 'を追加する前に、行をスキップします。私はちょうど、最初の行に '9'と' 19.3'の間にスペースが1つあり、後で各行について同様のスペースが欲しい – user5739619

関連する問題