2017-12-28 1 views
2

In einer einfachen Verarbeitung von Dateien nicht im i-ten Element der Schleife sind, wo Sie etwas für jede Datei in einem Verzeichnis tun wollen, tun Sie etwas wie folgt aus:Bash die Dateinamen übergeben, die

for i in file1 file2 file3 file5 
do 
echo "Processing $i" 
done 

Was ich hier machen möchte, ist, dass ich sowohl $ i als auch die Nicht-$ i-Dateien als Argument für einen Befehl übergebe. Sagen wir, mein Verzeichnis enthält 4 Dateien (Datei1, Datei2, Datei3, Datei5). Zum Beispiel möchte ich in der ersten Iteration der Schleife, wenn Datei1 verarbeitet wird, den Rest der Dateien (Datei2, Datei3, Datei5) an das Argument -b des Befehls übergeben.

Zum Beispiel erste Iteration der Schleife in bash sollte wie folgt aussehen:

FILES=/path/to/directory 
for i in $FILES 
do 
bedtools intersect -a $i -b file2 file3 file5 
done 

In zweiten Iteration wie die Datei2 in dem $ i der Rest der Dateien wird übergeben werden -b Argument.

for i in $FILES 
do 
bedtools intersect -a $i -b file1 file3 file5 
done 

und so weiter für alle Dateien im Verzeichnis. Kurz gesagt, übergeben Sie die aktuelle Datei an -a Argument und Rest der Dateien zu -b Argument.

Es wird toll wenn mir jemand dabei helfen kann. Vielen Dank.

Antwort

2

Sie können nur einen numerischen Schleife verwenden und Scheiben nehmen aus dem Array:

shopt -s nullglob 
files=(path/to/directory/*) 

for ((i = 0; i < ${#files[@]}; ++i)); do 
    file=${files[i]} 
    others=("${files[@]:0:i}" "${files[@]:i+1}") 
    bedtools intersect -a "$file" -b "${others[@]}" 
done 

Diese Schleifen obwohl die Indizes des Arrays files und Scheiben der Teil vor und nach dem aktuellen Index i die others zu erhalten .

+0

Vielen Dank für die Antwort, ich glaube, es nicht die richtig $ anderen Dateinamen ist vorbei. Ich bekomme einen Fehler dafür. Ich habe es manuell versucht und es funktioniert, wenn ich es folgendermaßen mache: 'bedtools schneiden sich -a file1.txt -b file2.txt file3.txt .. fileN.txt> output.txt'. Können Sie bitte eine Echozeile hinzufügen, damit ich sehen kann, was ich an diese Argumente übergebe? Vielen Dank. – Newbie

+0

Die $ others-Dateinamen sollten durch ein Leerzeichen getrennt sein. – Newbie

+0

Wenn Sie 'set -x' zum Skript hinzufügen, können Sie die Befehle sehen, die ausgeführt werden. –

0

Sie können auch wie folgt ausprobieren,

op=$(find /path/to/directory ! -iname ".*")              
temp=$op                   

for i in $op;                 
do                    
    rfile=${temp//$i/}               
    rfile=$(echo $rfile | tr '\n' ' ')           
    bedtools intersect -a $i -b $rfile            
done 
+0

Das ist falsch. Dateien mit beliebigen Leerstellen werden Ihren Code fürchterlich beschädigen! – PesaThe

0
count=0; files=(*) 
for i in ${files[*]}; do 
    unset files[count] 
    echo "bedtools intersect -a $i -b ${files[*]}" 
    files+=($i) 
    ((count++)) 
done 
+2

Dinge, die ernsthaft mit Ihrem Code falsch sind: 1) Dateinamen mit Leerzeichen löschen Ihren Code. 2) Sie verwenden nicht die Vorteile von Arrays, verwenden Sie stattdessen "$ {files [@]}" '! 3) Zitat Erweiterungen: 'Dateien + = (" $ i ")'. 4) Zitiere den 'unset'-Befehl, ansonsten ist es abhängig von der Pfadnamenerweiterung. Sollte Ihr Verzeichnis eine Datei namens "fileso" haben, würde dies Ihren Code beschädigen. Beachten Sie auch, dass Sie die Indizes des Arrays überlappen können. Es gäbe dann keinen Grund zum Zählen. – PesaThe

Verwandte Themen