Команда Piped awk працює як один лайнер, але не в циклі


0

У мене є частина сценарію, який не працює належним чином. Передбачається взяти список шляхів епізодів, розділених символом нового рядка, у форматі "/ volume1 / Shared Files / Cartoon / Show Name / Show Name SXX / file.mkv" (котирування, включені до файлу списку), запустити ці файли через mediainfo і додайте UID до кожного рядка.

Я можу отримати UID з одним лайнером

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

Однак, виконуючи наступний код:

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

Я отримую такі дані:

"/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"

Я знаю, що це не додасть UID, де я хочу, це просто спроба налагодження. Я очікую, що принаймні один з цих двох порожніх рядків між кожним рядком echo $ міститиме UID. Я не знаю, де це відбувається: /

(працює під bash на Synology DS412 +)

Відповіді:


0

Подвійні лапки читаються в line змінна і передається як частина параметра mediainfo. Я ніколи не люблю використовувати read для читання цілих рядків, воліючи використовувати line замість цього.

Необхідно видалити котирування з вхідних даних і використовувати: -

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

Ви повинні двічі цитувати всі примірники $line, не тільки в рядку, який я показав.

Зверніть увагу на це line точно читає рядки, включаючи провідні та кінцеві заготовки, які read смужки.


Оновлено до: while 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 Унікальний | awk '{print $ 4}' `var2 = echo /volume1/@appstore/nzbdrone/bin/mediainfo "$line" | grep Unique | awk '{print $4}' echo $ line echo $ var2 зроблено & lt; $ WorkingDir / output.txt` Але я тепер отримую /volume1/Tom/Scripts/BaconSonarr/xseednzb-0.1.2.sh: line 25: line: command not found
boardwarp

Я припускаю, що ваш цикл починається з 25-го рядка вашого сценарію. Схоже, у вас немає line Команда встановлена: перевірте шляхом введення type line або which line. У Ubuntu це частина util-linux пакет, встановлений за замовчуванням. Якщо ви не можете знайти його, можете скористатися head -n1 замість цього, перша лінія стає while line=$(head -n1); do (Я використав позначку $ (), щоб зупинити плутанину з зворотною цитатою для вбудованого коду, але ви можете використовувати зворотні котирування у вашому сценарії).
AFH

Це працює на Synology, вони досить розріджені за замовчуванням в порівнянні з повним дистрибутивом. Я спробував head -n1 спочатку, але це викликало нескінченний цикл порожніх рядків. Далі встановив util-linux через ipkg, повернувшись до коду, який ви спочатку запропонували, і він працює як слід! Дуже дякую :)
boardwarp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.