2013-10-14 2 views
0

У нас есть тысячи файлов, сохраненных в одном каталоге. Обычная картина - дата. Например:Извлечь имя файла до первой строки

foo-2013-09-01.gz 
bar-2013-09-01.gz 
fu-2013-09-02.gz 
ba-2013-09-02.gz 
cat-2013-09-01.gz 
dog-2013-09-02.gz 
dog-2013-09-03.gz 

Как мы можем получить список уникальных имен файлов непосредственно перед первой тире? Например.

foo 
bar 
fu 
ba 
cat 
dog 

Мы не беспокоили с именами путей, но только первая часть (если вы можете увидеть это в формате типа-date.filext). Мы намерены использовать конечный результат в цикле for, который создаст подкаталог для каждого типа, который имеет все остальные файлы по дате.

+0

Как это соотносится с Hadoop? – Tariq

ответ

2

Одним из способов было бы сказать:

ls -1 | sed 's/-.*//g' | sort -u 

Для avoid parsing ls output, вы могли бы сказать:

find . -mindepth 1 -maxdepth 1 -type f -printf "%P\n" | sed 's/-.*//g' | sort -u 
1

Использование sed 's/-.*//':

[email protected]:/tmp/t$ ls 
ba-2013-09-02.gz cat-2013-09-01.gz dog-2013-09-03.gz fu-2013-09-02.gz 
bar-2013-09-01.gz dog-2013-09-02.gz foo-2013-09-01.gz 
[email protected]:/tmp/t$ ls | sed 's/-.*//' 
ba 
bar 
cat 
dog 
dog 
foo 
fu 
2

Если у вас есть список файлов:

... | awk -F'-' '!x[$0=$1]++' | xargs mkdir 
0

Это может работать для вас (GNU SED):

sed -r 's/-.*//;G;/^([^\n]+)\n.*\<\1\>/d;h;P;d' file 

усечь имя файла, а затем использовать трюм для проверки уникальных ключей , Если ключ уже существует, удалите эту строку, иначе добавьте его в пространство удержания, а затем распечатайте уникальный ключ.

Смежные вопросы