Модифицируйте sed так, чтобы назначать уникальные части файла в переменную - PullRequest
0 голосов
/ 26 июня 2018

У меня есть папка с несколькими разными именами файлов, каждое с общим шаблоном, например следующим:

SampleA-1.txt

SampleA-2.txt

SampleA-3.txt

SampleB-1.txt

SampleB-2.txt

Образец B-3.txt

и т. Д.

Я хочу использовать sed, чтобы получить только уникальное имя файла перед частью "-number.txt". Другими словами, я хочу следующий результат:

SampleA

SampleB

SampleC

и т.д.

И я хочу присвоить вышеупомянутое в переменной (например, SAMPLE) внутри цикла for. Итак, у меня есть следующее:

    for FILE in $HOME_PATH/*.txt
do
    SAMPLE=`basename $FILE | sed s/\.1.txt//`

, который делает именно то, что я хочу, но, очевидно, только когда у меня есть файлы Sample * -1.txt, а не -2 или -3s внутри $ HOME_PATH. По сути, я хочу удалить все после "-" и назначить уникальные имена в переменной. Можете ли вы предложить модификации моего седа? Я уверен, что это легко сделать, но я попробовал несколько вариантов безуспешно, поэтому я упускаю что-то очевидное здесь.

Заранее спасибо за усилия!

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Нет sed необходимо, используя только расширение параметра :

for file in "$dir"/*.txt; do
    sample=${file##*/}
    sample=${sample%-*}
done
0 голосов
/ 26 июня 2018
VAR="$( 
    for f in $HOME_PATH; do 
        basename $f | sed -n "s/\-[0-9]\+\.txt//p"; 
    done | sort | uniq )"
echo "$VAR"

Это перебирает все файлы, как в предыдущем примере, и обрезает секции -1.txt (за исключением того, что [0-9]\+ соответствует любому числу сзади).

Это печатает только имена файлов, которые соответствуют шаблону: -n означает, что по умолчанию ничего не печатается, а /p в конце оператора sed говорит ему печатать, если он находит совпадение

На данный момент у вас есть список, который выглядит следующим образом: SampleA SampleA SampleA SampleB SampleB SampleB

Затем он перенаправляет вывод в sort (если они вышли из строя), а затем в uniq, что удаляет любые повторяющиеся записи (примечание - uniq требует отсортированного ввода). Это даст вам вывод

 SampleA 
 SampleB

Это затем присваивается $VAR

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...