bash скрипт для сортування дублікатів у текстовому файлі


2

Я перетворив весь flac у моїй музичній бібліотеці до mp3, так що я можу перемістити flac до зовнішнього диска. Я використовував dbpoweramp у вікнах, і я впевнений, що він перетворив їх все, але коли я прокинувся сьогодні вранці, нетбук був перезапущений.

Так що я зробив список з усією своєю музикою в ньому і використовував сортування, щоб алфавітувати його. Тому у мене є щось на зразок цього:

~/music/a/a.flac
~/music/a/a.mp3
~/music/a/b.flac
~/music/a/b.mp3
~/music/b/a.mp3
~/music/b/b.mp3
~/music/c/a.flac
~/music/c/a.mp3

Зауважте, що у мене є каталог з лише mp3, оскільки не вся моя бібліотека була flac.

Те, що я хочу, це bash-скрипт, який перевірить, що всі рядки, які закінчуються .flac, мають прямо під ними рядок, який є таким же, за винятком того, що закінчується на .mp3.

Як би я досягти цього, і якщо ви можете пояснити, що робить сценарій, це теж було б здорово.

Я думаю, це сорт важливо, щоб показати будь-які лінії, які закінчуються. Flac, що не мають відповідних.


Відповіді:


2
awk '
    root && $0 != root ".mp3" {printf("%d: %s.flac\n", line, root)}
    /.flac$/ {
        root=$0
        sub(/.flac$/, "", root)
        line = NR
        next
    }
    { root = "" }
' filename

Як це працює?

Починаючи з початку лінії /.flac$/, кожна лінія, яка закінчується на ".flac", створити ім'я змінної root містить лінію мінус розширення. Зберігає поточний номер рядка. Перейти до наступного рядка, щоб уникнути стирання кореневої змінної.

Перехід на перший рядок. Це вираз root && $0 != root ".mp3" засоби: root не є порожнім І поточний рядок ( $0 ) не дорівнює значенню кореневої змінної плюс ".mp3". Якщо цей вираз обчислюється як true, поточний рядок не є файлом MP3, відповідним попередньому файлу FLAC.

Останній рядок стирає значення кореневої змінної. Ця частина сценарію досягається лише у випадку, якщо поточний рядок не є файлом FLAC, тому ми не хочемо робити порівняння з наступним рядком.


Це чудово працювало! Якщо у вас є час, ви можете пояснити, що він робить? Я хотів би дізнатися про awk і bash.
Rob

@Rob, відповідь оновлено.
glenn jackman

Дякую, я думаю, що я це зрозумів. Безумовно, не надто складно.
Rob

1

Я знайшов інший спосіб зробити це, використовуючи diff, але ще не зробив його у сценарій bash. Я розміщу тут, якщо знайду спосіб зробити це.

Гленн опублікував великий сценарій, який працює, але ось як я це зробив.

Я зробив два відсортовані файли, один з .flac і один з .mp3 з find ~/music -name *.flac | sort > ~/documents/flac і find ~/music -name *.mp3 | sort > ~/documents/mp3

Потім я зняв розширення у vim

vim ~/documents/flac
:%s/.....$//
:w
:e ~/documents/mp3
:%s/....$//
:wq

А потім я й зробив diff ~/documents/mp3 ~/documents/flac | grep '>' що нічого не покаже, якби все було зроблено правильно, і покажіть мені рядки flacs, які не мали mp3.

Я впевнений, що я перекладаю це в одне або рядки, але відповідь Гленна чудово працювала з файлом, який я мав.


1

Можна також використовувати find.

За допомогою циклу while після пошуку:

find . -name '*.flac' | while read file ; do test -f `dirname $file`/`basename $file .flac`.mp3 && echo $file; done

Використовуючи (багато) підшаруші:

find . -name '*.flac' -exec sh -c 'test -f `echo {} |sed s/\.flac$/.mp3/` && echo {}' \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.