拡張列値に基づいたCSVファイルのフィルタリング

拡張列値に基づいたCSVファイルのフィルタリング

次のCSVファイルがあります。

ID,PDBID,FirstResidue,SecondResidue,ThirdResidue,FourthResidue,Pattern
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_3,4tov,1043,1044,1047,1048,CC/GA Naked ribose-zipper
RZ_AUTO_4,4tov,1556,1557,1514,1515,CC/GA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_6,4tow,766,767,1524,1525,AA/CG Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

各行を繰り返しながら、FirstResidueとSecondResidueの値を拡張できる行を印刷する必要があります(つまり、SecondResidueは同じPDBIDを使用する別の行でFirstResidueになります)。たとえば、行(RZ_AUTO_1行とRZ_AUTO_2行)はAND(RZ_AUTO_5行とRZ_AUTO_7行)です.出力は次のようになります。

RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

awkまたは他のUNIXメソッドを使用してこれを実行できますか?私はOSXを使用しています。

答え1

次のことを試すことができます。

$ sort -rt"," -k2,3 file.csv | 
   awk -F, '{a[$2][$3]=$0; if(a[$2][$4]){print a[$2][$4]; print;}}'
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper

説明する

  • sortファイルは2番目と3番目のフィールドに基づいてソートされ、同じPDBIDを持つ行が一緒にソートされ、関数の最初の残りの場所に基づいてソートされます。-r並べ替えを逆にするには(より大きい数字が最初に印刷されるように)、フィールド区切り-t,記号をに設定し、並べ替えるフィールド,-k定義します。

awkスクリプトは次のとおりです。

  • -F,:フィールド区切り記号をに設定します,
  • a[$2][$3]=$0;:リストのリスト、2次元配列です。たとえば、最初の行の場合は配列名のみですa[4tov][1404]=$0a値は現在の行に設定されます$0
  • if(a[$2][$4]):4番目のフィールド(2番目の残差)が最初の残余と同じPDBIDを持つことが確認された場合。
  • print a[$2][$4]; print;:現在の行(配列の値として保存されるためa)と現在の行を印刷します。

確認するためにOSXにアクセスすることはできませんが、あなたのコメントawk、Pythonとは異なり、OSXはGNU awk多次元配列を処理できないようです。したがって、Perlでも同じことが起こります。

sort -rt"," -k2,3 file.csv | 
 perl -F"," -ane '$k{$F[1]}{$F[2]}=$_; 
                  print "$k{$F[1]}{$F[3]}$_" if $k{$F[1]}{$F[3]}'

答え2

あなたはそれを使用することができますテキストクエリSQLデータベースなどのスプレッドシートデータを照会します。

答え3

python3でモジュールを使用してくださいre

#!/usr/bin/python3
import re
import sys
j = sys.argv[1]
with open(j) as f:
    fil = f.read()
m = re.findall(r'(?s)(?:^|\n)([^,]*,([^,]*),[^,]*,([^,]*)[^\n]*).*?\n([^,]*,\2,\3,[^\n]*)', fil)
for i in m:
    print(i[0]+'\n'+i[-1])

上記のコードをという名前のファイルに保存し、端末でscript.py次のコマンドを実行してファイルを実行します。

python3 script.py inputfile

正規表現のデモ

$ python3 script.py file.csv
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

関連情報