Linux - GeneralThis Linux forum is for general Linux questions and discussion.
If it is Linux Related and doesn't seem to fit in any other forum then this is the place.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
I hate to let it go.
If I understand you correctly this time, you want to grab any section between TER. something like this maybe....
Code:
#!/usr/bin/perl -w
# ./myscript A 1KDX.pdb file.txt
if($#ARGV != 2){
die "Example: $0 A 1KDX.pdb file.txt \n";
}
my $LETTER = $ARGV[0];
my $IN = $ARGV[1];
my $OUT = $ARGV[2];
open(INFILE, "$IN") or die "Can’t open 1KDX.pdb for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open file.txt for write: $!";
while (<INFILE>){
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.................$LETTER)/ or /(^HETATM...............$LETTER)/;
}
close INFILE;
close OUTFILE;
I hate to let it go.
If I understand you correctly this time, you want to grab any section between TER. something like this maybe....
Code:
#!/usr/bin/perl -w
# ./myscript A 1KDX.pdb file.txt
if($#ARGV != 2){
die "Example: $0 A 1KDX.pdb file.txt \n";
}
my $LETTER = $ARGV[0];
my $IN = $ARGV[1];
my $OUT = $ARGV[2];
open(INFILE, "$IN") or die "Can’t open 1KDX.pdb for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open file.txt for write: $!";
while (<INFILE>){
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.................$LETTER)/ or /(^HETATM...............$LETTER)/;
}
close INFILE;
close OUTFILE;
It works now, just one small problem
In case i file like this
Code:
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
TER A 1234
HETATM A 1234
HETATM A 1234
HETATM A 1234
the script outputs lines starts from HETATM and having A after the TER. It should simply output
Code:
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
right now, it outputs
Code:
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
Atom A 1234
HETATM A 1234
HETATM A 1234
HETATM A 1234
Maybe you could use another argument at the command.
For example: ./myscript ATOM A 1AV1.pdb file.txt
EDIT: It may be best to use subs to handle the different length of the words ATOM and HETAM
Code:
#!/usr/bin/perl -w
# ./myscript ATOM A 1AV1.pdb file.txt
if($#ARGV != 3){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $NAME = $ARGV[0];
my $LETTER = $ARGV[1];
my $IN = $ARGV[2];
my $OUT = $ARGV[3];
open(INFILE, "$IN") or die "Can’t open 1KDX.pdb for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open file.txt for write: $!";
while (<INFILE>){
ATOM() if ($NAME =~ /ATOM/);
HETATM() if ($NAME =~ /HETATM/);
}
sub ATOM {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
}
sub HETATM {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
}
close INFILE;
close OUTFILE;
Maybe you could use another argument at the command.
For example: ./myscript ATOM A 1AV1.pdb file.txt
EDIT: It may be best to use subs to handle the different length of the words ATOM and HETAM
Code:
#!/usr/bin/perl -w
# ./myscript ATOM A 1AV1.pdb file.txt
if($#ARGV != 3){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $NAME = $ARGV[0];
my $LETTER = $ARGV[1];
my $IN = $ARGV[2];
my $OUT = $ARGV[3];
open(INFILE, "$IN") or die "Can’t open 1KDX.pdb for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open file.txt for write: $!";
while (<INFILE>){
ATOM() if ($NAME =~ /ATOM/);
HETATM() if ($NAME =~ /HETATM/);
}
sub ATOM {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
}
sub HETATM {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
}
close INFILE;
close OUTFILE;
But now it does not output the HETATM before the TER. It should show all the ATOM and HETATM before the TER, but not after the TER.
is that possible?
Well back to the old command:
./test A 1AV1.pdb file.txt
Something like this?????
Code:
#!/usr/bin/perl -w
# ./myscript A 1AV1.pdb file.txt
if($#ARGV != 2){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $LETTER = $ARGV[0];
my $IN = $ARGV[1];
my $OUT = $ARGV[2];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /^ATOM.*/;
# print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
}
close INFILE;
close OUTFILE;
Well back to the old command:
./test A 1AV1.pdb file.txt
Something like this?????
Code:
#!/usr/bin/perl -w
# ./myscript A 1AV1.pdb file.txt
if($#ARGV != 2){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $LETTER = $ARGV[0];
my $IN = $ARGV[1];
my $OUT = $ARGV[2];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /^ATOM.*/;
# print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
}
close INFILE;
close OUTFILE;
It still outputs the lines starting with HETATM..........A or B, after TER. I tried put next if TER, but it dint read B,C or D. so back to shift it.
I'm having trouble understanding what you want to do.
Something like this?
Code:
while (<INFILE>){
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
next if /^HETATM.*/;
print OUTFILE if /^ATOM.*/;
}
I'm having trouble understanding what you want to do.
Something like this?
Code:
while (<INFILE>){
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
next if /^HETATM.*/;
print OUTFILE if /^ATOM.*/;
}
Code:
#!/usr/bin/perl -w
# ./myscript A 1AV1.pdb file.txt
if($#ARGV != 2){
die "Example: $0 A 1AV1.pdb file.txt \n";
}
my $LETTER = $ARGV[0];
my $IN = $ARGV[1];
my $OUT = $ARGV[2];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.................$LETTER\b)/ or /(^HETATM...............$LETTER\b)/;
next if /^HETATM.*/;
print OUTFILE if /^ATOM.................$LETTER/;
}
close INFILE;
close OUTFILE;
This is what i have on my script now. Lemme explain again
I have the following text file
Code:
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
TER <17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
TER <17 Random Charecters> B < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> B < many more random characters>
HETATM<15 Random Charecters> B < many more random characters>
HETATM<15 Random Charecters> B < many more random characters>
Now i need a code to divide this file into many seperate files. In case i select A, It should output
Code:
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
ATOM<17 Random Charecters> A < many more random characters>
TER <17 Random Charecters> A < many more random characters>
if i select B, It should output
Code:
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
ATOM<17 Random Charecters> B < many more random characters>
TER <17 Random Charecters> B < many more random characters>
and If i select HETATM, It should select only the HETATM after the LAST TER, which is
Code:
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> A < many more random characters>
HETATM<15 Random Charecters> B < many more random characters>
HETATM<15 Random Charecters> B < many more random characters>
HETATM<15 Random Charecters> B < many more random characters>
Right now, the code you gave me, select the HETATM after TER when i select A or B.
#!/usr/bin/perl -w
# ./myscript ATOM A 1AV1.pdb file.txt
if($#ARGV != 3){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $NAME = $ARGV[0];
my $LETTER = $ARGV[1];
my $IN = $ARGV[2];
my $OUT = $ARGV[3];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
ATOM_A() if ($NAME =~ /ATOM/ and $LETTER =~ /A/);
ATOM_B() if ($NAME =~ /ATOM/);
HETATM() if ($NAME =~ /HETATM/);
}
sub ATOM_A {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
}
sub ATOM_B {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
}
sub HETATM {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
}
close INFILE;
close OUTFILE;
#!/usr/bin/perl -w
# ./myscript ATOM A 1AV1.pdb file.txt
if($#ARGV != 3){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $NAME = $ARGV[0];
my $LETTER = $ARGV[1];
my $IN = $ARGV[2];
my $OUT = $ARGV[3];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
ATOM_A() if ($NAME =~ /ATOM/ and $LETTER =~ /A/);
ATOM_B() if ($NAME =~ /ATOM/);
HETATM() if ($NAME =~ /HETATM/);
}
sub ATOM_A {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
}
sub ATOM_B {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
}
sub HETATM {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
}
close INFILE;
close OUTFILE;
#!/usr/bin/perl -w
# ./myscript ATOM A 1AV1.pdb file.txt
if($#ARGV != 3){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $NAME = $ARGV[0];
my $LETTER = $ARGV[1];
my @X = ("[B-D]", "[C-D]", "D");
my $IN = $ARGV[2];
my $OUT = $ARGV[3];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
ATOM_A() if ($NAME =~ /ATOM/ and $LETTER =~ /A/);
ATOM_B() if ($NAME =~ /ATOM/ and $LETTER =~ /B/);
ATOM_C() if ($NAME =~ /ATOM/ and $LETTER =~ /C/);
ATOM_D() if ($NAME =~ /ATOM/ and $LETTER =~ /D/);
HETATM_A() if ($NAME =~ /HETATM/ and $LETTER =~ /A/);
HETATM_B() if ($NAME =~ /HETATM/ and $LETTER =~ /B/);
HETATM_C() if ($NAME =~ /HETATM/ and $LETTER =~ /C/);
HETATM_D() if ($NAME =~ /HETATM/ and $LETTER =~ /D/);
}
sub ATOM_A {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^ATOM.{17}$X[0]\b)/;
}
sub ATOM_B {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
print OUTFILE if /(^ATOM.{17}$X[1]\b)/;
}
sub ATOM_C {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
print OUTFILE if /(^ATOM.{17}$X[2]\b)/;
}
sub ATOM_D {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}D\b)/;
}
sub HETATM_A {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^HETATM.{15}$X[0]\b)/;
}
sub HETATM_B {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^HETATM.{15}$X[1]\b)/;
}
sub HETATM_C {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^HETATM.{15}$X[2]\b)/;
}
sub HETATM_D {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}D\b)/;
}
close INFILE;
close OUTFILE;
#!/usr/bin/perl -w
# ./myscript ATOM A 1AV1.pdb file.txt
if($#ARGV != 3){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $NAME = $ARGV[0];
my $LETTER = $ARGV[1];
my @X = ("[B-D]", "[C-D]", "D");
my $IN = $ARGV[2];
my $OUT = $ARGV[3];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
ATOM_A() if ($NAME =~ /ATOM/ and $LETTER =~ /A/);
ATOM_B() if ($NAME =~ /ATOM/ and $LETTER =~ /B/);
ATOM_C() if ($NAME =~ /ATOM/ and $LETTER =~ /C/);
ATOM_D() if ($NAME =~ /ATOM/ and $LETTER =~ /D/);
HETATM_A() if ($NAME =~ /HETATM/ and $LETTER =~ /A/);
HETATM_B() if ($NAME =~ /HETATM/ and $LETTER =~ /B/);
HETATM_C() if ($NAME =~ /HETATM/ and $LETTER =~ /C/);
HETATM_D() if ($NAME =~ /HETATM/ and $LETTER =~ /D/);
}
sub ATOM_A {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^ATOM.{17}$X[0]\b)/;
}
sub ATOM_B {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
print OUTFILE if /(^ATOM.{17}$X[1]\b)/;
}
sub ATOM_C {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
print OUTFILE if /(^ATOM.{17}$X[2]\b)/;
}
sub ATOM_D {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}D\b)/;
}
sub HETATM_A {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^HETATM.{15}$X[0]\b)/;
}
sub HETATM_B {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^HETATM.{15}$X[1]\b)/;
}
sub HETATM_C {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
print OUTFILE if /(^HETATM.{15}$X[2]\b)/;
}
sub HETATM_D {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}D\b)/;
}
close INFILE;
close OUTFILE;
It still reads the HETATM after the TER , Also, a File can have more then A,B,C, and D. It might have till Z. or instead of A,B, C or D, It might be named as 1,2,3 also. Pretty complicated isnt it?
#!/usr/bin/perl -w
# ./myscript ATOM A 1AV1.pdb file.txt
if($#ARGV != 3){
die "Example: $0 ATOM A 1AV1.pdb file.txt \n";
}
my $NAME = $ARGV[0];
my $LETTER = $ARGV[1];
my $IN = $ARGV[2];
my $OUT = $ARGV[3];
open(INFILE, "$IN") or die "Can’t open $IN for read: $!";
open(OUTFILE, "> $OUT") or die "Can't open $OUT for write: $!";
while (<INFILE>){
ATOM_A() if ($NAME =~ /ATOM_A/);
ATOM_B() if ($NAME =~ /ATOM/);
HETATM() if ($NAME =~ /HETATM/);
}
sub ATOM_A {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/ or /(^HETATM.{15}A\b)/;
}
sub ATOM_B {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^ATOM.{17}$LETTER\b)/;
}
sub HETATM {
shift if /^TER.*/../$_\n/;
print OUTFILE if /(^HETATM.{15}$LETTER\b)/;
}
close INFILE;
close OUTFILE;
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.