2016-07-28 3 views
0

Ich habe ein Bash-Skript geschrieben, um eine Datei zu teilen. Die Datei sieht wie folgt aus:csplit Präfix als Dateikontext

@<TRIPOS>MOLECULE 
ZINC32514653 
.... 
.... 

@<TRIPOS>MOLECULE 
ZINC982347645 
.... 
.... 

Hier ist das Skript schrieb ich:

#!/bin/bash 
#split the file into files named xx##.mol2 
csplit -b %d.mol2 ./Zincpharmer_ligprep_1.mol2 '/@<TRIPOS>MOLECULE/' '{*}' 
#rename all files called xx##.mol2 by their 2nd line which is ZINC###### 
for filename in ./xx*.mol2; 
do 
    newFilename=$(echo $filename | sed -n 2p $filename) 
    if [ ! -e "./$newFilename.mol2" ]; then 
    mv -i $filename ./$newFilename.mol2 

    else 
     num=2 
     while [ -e "./"$newFilename"_$num.mol2" ]; do 
     num=$((num+1)) 
     done 
     mv $filename "./"$newFilename"_$num.mol2" 
    fi 
    done 

Ich habe zwei Fragen:

1) ist es eine Möglichkeit, das Präfix Option in csplit aufzunehmen und csplit sagt, dass das Präfix die Zeile nach dem Trennzeichen ist.

2) Die erste von csplit xx00 erstellte Zeile ist eine leere Datei, da sich das Trennzeichen in der ersten Zeile befindet. Wie kann ich das vermeiden?

Die erwartete Ausgabe wäre Dateien mit den Namen ZINC32514653.mol2 und ZINC982347645.mol2. Eine falls es zwei Einträge mit dem gleichen ZINC### ZINC982347645_2.mol2 gibt.

+0

Wenn Sie die erwartete Ausgabe und eine Beispieleingabe hinzufügen können, werden die Leute hier versuchen und Ihnen eine möglicherweise effektivere Lösung geben! – Inian

Antwort

0

Alles, was Sie, wenn von dieser man csplit Seite wissen müssen: -

csplit zu sagen, das Präfix zu ändern: -

-f, --prefix=PREFIX 
     use PREFIX instead of 'xx' 

Um leere Dateien auszuschließen: -

-z, --elide-empty-files 
     remove empty output files 
+0

Mit anderen Worten, die Antwort auf die erste Frage lautet nein. –

+0

@MichaelVehrs: Ich bin mir nicht sicher, warum du das gesagt hast, weil ich die '-f'-Flagge für das – Inian

+0

sehen konnte Danke für deine Antworten bis jetzt, ich habe die Option -z nicht gesehen. Ich bin mir der Option -f bewusst. Aber wie teilt man dem System mit, dass das Präfix die Zeile nach dem Trennzeichen sein soll, also ZINC#####? –

0

Dies ist mit csplit nicht möglich. Ich empfehle etwas in der Art von:

awk '/@<TRIPOS>MOLECULE/ { getline file; next } {print $0 > file }'