Der Befehl Piped awk arbeitet als Einzeiler, jedoch nicht in einer Schleife

0

Ich habe einen Teil eines Skripts, der nicht wie erwartet funktioniert. Es soll eine Liste von durch neue Zeilen getrennten Episodenpfaden im Format "/ volume1 / Shared Files / Cartoon / Show Name / Show Name SXX / file.mkv" (Anführungszeichen in der Listendatei enthalten) erstellt werden. Führen Sie diese Dateien über mediainfo und aus Hängen Sie die UID an jede Zeile an.

Ich kann die UID mit dem Einzeiler erhalten

/volume1/@appstore/nzbdrone/bin/mediainfo "/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv" | grep Unique | awk '{print $4}'

Wenn Sie jedoch den folgenden Code ausführen:

while read line; do
echo $line
/volume1/@appstore/nzbdrone/bin/mediainfo $line | grep Unique | awk '{print $4}' > $WorkingDir/output2.txt
echo `/volume1/@appstore/nzbdrone/bin/mediainfo $line | grep Unique | awk '{print $4}'`
var1=`echo /volume1/@appstore/nzbdrone/bin/mediainfo $line | grep Unique | awk '{print $4}'`
echo $var1
done < $WorkingDir/output.txt

Ich erhalte folgende Ausgabe:

"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"


"/volume1/Shared Files/Cartoon/Show Name/Show Name SXX/file.mkv"

Ich weiß, dass die UIDs nicht an die von mir gewünschte Stelle angehängt werden. Dies ist nur ein Versuch, Fehler zu beheben. Ich würde erwarten, dass mindestens eine dieser beiden Leerzeilen zwischen jeder echo $ -Zeile die UID enthält. Ich weiß nicht, wo es schief geht: /

(Laufen unter Bash auf einer Synology DS412 +)

boardwarp
quelle

Antworten:

0

Die doppelten Anführungszeichen werden in die gelesen line Variable und als Teil des Parameters an übergeben mediainfo. Ich benutze nie gerne read zum Lesen ganzer Zeilen, am liebsten mit dem line Befehl statt.

Sie sollten die Anführungszeichen aus der Eingabe entfernen und stattdessen Folgendes verwenden:

while line=`line`; do
. . . . . .
/volume1/@appstore/nzbdrone/bin/mediainfo "$line" | grep Unique | awk '{print $4}' > $WorkingDir/output2.txt
. . . . . .

Sie sollten alle Instanzen von in Anführungszeichen setzen $line, nicht nur in der Zeile, die ich gezeigt habe.

Beachten Sie, dass line Liest Zeilen präzise, ​​einschließlich der führenden und nachfolgenden Leerzeichen, die read Streifen.

AFH
quelle
Aktualisiert auf: while line= Linie ; do echo $line /volume1/@appstore/nzbdrone/bin/mediainfo "$line" | grep Unique | awk '{print $4}' > $WorkingDir/output2.txt echo / volume1 / @ appstore / nzbdrone / bin / mediainfo "$ line" | grep Unique | awk '{print $ 4}' `var2 = echo /volume1/@appstore/nzbdrone/bin/mediainfo "$line" | grep Unique | awk '{print $4}' echo $ line echo $ var2 done & lt; $ WorkingDir / output.txt` Aber ich verstehe jetzt /volume1/Tom/Scripts/BaconSonarr/xseednzb-0.1.2.sh: line 25: line: command not found
boardwarp
Ich gehe davon aus, dass Ihre Schleife in der 25. Zeile Ihres Skripts beginnt. Es sieht so aus, als hättest du das nicht line Befehl installiert: Bestätigen Sie durch Eingabe type line oder which line. In Ubuntu ist es Teil der util-linux Paket, standardmäßig installiert. Wenn Sie es nicht finden können, können Sie es verwenden head -n1 stattdessen wird so die erste zeile while line=$(head -n1); do (Ich habe die Notation $ () verwendet, um Verwechslungen mit dem Back-Zitat für eingebetteten Code zu vermeiden, aber Sie können Back-Zitate in Ihrem Skript verwenden.)
AFH
Dies läuft auf einer Synology, sie sind standardmäßig ziemlich spärlich im Vergleich zu einer Volldistribution. Ich habe es versucht head -n1 Zunächst aber verursachte es eine Endlosschleife von Leerzeilen. Als nächstes installierte ich util-linux via ipkg und stellte den Code wieder her, den Sie ursprünglich vorgeschlagen hatten. Es funktioniert wie erwartet! Vielen Dank :)
boardwarp