Извлечение первой строки в группе - PullRequest
0 голосов
/ 18 января 2019

У меня есть огромный файл, содержащий список каталогов и файлов (сгенерированный find). Это содержимое примерно так:

./12345/a1abeff031.dat
./12345/a1abeef03a.dat
./12345/a1abefa032.dat
./12346/c3abeff031.dat
./12346/a1abeff031.dat
./12347/a2abeff021.dat

Итак, мне просто нужен один файл из каждого каталога (порядок не имеет значения), желаемый результат таков:

./12345/a1abeff031.dat
./12346/c3abeff031.dat
./12347/a2abeff021.dat

Как я могу получить это, используя shell / awk / grep / sed или другие инструменты командной строки?

Ответы [ 3 ]

0 голосов
/ 18 января 2019

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

sed -E ':a;N;s/^(([^/]*\/[^/]*\/).*)\n\2.*/\1/;ta;P;D' file

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

Чтобы напечатать последний файл в наборе дубликатов, используйте:

sed -E 'N;/^([^/]*\/[^/]*\/).*\n\1/!P;D' file
0 голосов
/ 18 января 2019

Использование Perl

perl -F"/" -lane ' print unless $kv{$F[1]}++ ' 

с заданным входом

$ cat leonard.txt
./12345/a1abeff031.dat
./12345/a1abeef03a.dat
./12345/a1abefa032.dat
./12346/c3abeff031.dat
./12346/a1abeff031.dat
./12347/a2abeff021.dat
$ perl -F"/" -lane ' print unless $kv{$F[1]}++ ' leonard.txt
./12345/a1abeff031.dat
./12346/c3abeff031.dat
./12347/a2abeff021.dat
$
0 голосов
/ 18 января 2019

Не могли бы вы попробовать один раз.

awk -F'/' '!a[$2]++' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...