次の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]=$0
。a
値は現在の行に設定されます$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]}'