Intereting Posts
На OpenRC есть ли какие-либо условные обозначения, например,? как установить avxsynth на centos? Ожидайте, чтобы скрипт автоматически регистрировался, командовал и показывал свой вывод Что означает эта ошибка: «igmp : setsockopt IP_MSFILTER"? Lightdm: запуск среды рабочего стола в зависимости от того, какой пользователь вошел в систему Конки буфер слишком мал? POSIX Awk на Solaris 11? Как запустить службу systemd после команды mount Несколько изображений в корневом окне с ImageMagick Должен / dev / random и / dev / urandom создаваться каждой загрузкой, или это статические файлы, которые можно поместить в tar? Используйте регулярное выражение, чтобы проверить, имеет ли конкретный каталог папки, начиная с определенного слова Ошибка Git pull libcurl.so.3 не найдена Что означает обратная косая черта при поиске десятичных знаков Как проверить, какая версия vncserver установлена ​​на моем компьютере? Программа Shell, которая выводит средние значения

Сопоставьте первую часть имени пути и номера в конце строки

У меня есть следующий тип вывода из find и grep pipe

 ./Columbia/815425_0001104659-11-049107.txt: CENTRAL INDEX KEY: 0000815425 ./Columbia/815425_0001104659-12-060231.txt: CENTRAL INDEX KEY: 0000815425 ./Columbia/815425_0001104659-13-066298.txt: CENTRAL INDEX KEY: 0000815425 ./Dimensional Advisors/355437_0001137439-04-000108.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-05-000205.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-06-000306.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-08-000364.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-09-000076.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-12-000295.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001140361-10-035592.txt: CENTRAL INDEX KEY: 0000355437 

Я хотел бы получить

 Columbia 0000815425 Columbia 0000815425 Columbia 0000815425 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 

Я думал о sed и grep , но я застрял в том, как объединить все: совпадение первой части: (как мне соответствовать непосредственно перед / ?)

 erik Funds$ cat myoutput | egrep -o "[AZ].*/" Columbia/ Columbia/ Columbia/ Dimensional Advisors/ Dimensional Advisors/ Dimensional Advisors/ Dimensional Advisors/ Dimensional Advisors/ Dimensional Advisors/ Dimensional Advisors/ 

и последние 10-значные цифры:

 erik Funds$ cat myoutput | egrep -o "[0-9]{10}$" 0000815425 0000815425 0000815425 0000355437 0000355437 0000355437 0000355437 0000355437 0000355437 0000355437 

awk с / как разделитель полей, а затем печать поля 2 и поля 3 (с нулевым заполнением):

 ... | awk -F/ '{ printf("%s %010d\n", $2, $3) }' 

Пример:

 $ cat file.txt ./Columbia/815425_0001104659-11-049107.txt: CENTRAL INDEX KEY: 0000815425 ./Columbia/815425_0001104659-12-060231.txt: CENTRAL INDEX KEY: 0000815425 ./Columbia/815425_0001104659-13-066298.txt: CENTRAL INDEX KEY: 0000815425 ./Dimensional Advisors/355437_0001137439-04-000108.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-05-000205.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-06-000306.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-08-000364.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-09-000076.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001137439-12-000295.txt: CENTRAL INDEX KEY: 0000355437 ./Dimensional Advisors/355437_0001140361-10-035592.txt: CENTRAL INDEX KEY: 0000355437 $ awk -F/ '{ printf("%s %010d\n", $2, $3) }' file.txt Columbia 0000815425 Columbia 0000815425 Columbia 0000815425 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 
 $ sed -E 's|^\./([^/]+)/.*\s([0-9]+)$|\1 \2|' myoutput Columbia 0000815425 Columbia 0000815425 Columbia 0000815425 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 
  • -E расширенное регулярное выражение
  • ^\./ match ./ в начале строки
  • ([^/]+) захватывать не-символы
  • /.*\s соответствует / и любое количество символов, за которыми следует символ пробела
  • ([0-9]+)$ фиксируют цифры в конце строки
  • \1 \2 вставьте захваченные группы с пространством между ними

sed позволяет использовать любой разделитель кроме \ и новой строки, поэтому используйте | здесь, чтобы избежать выхода /

awk – использование разделения FS

Если вы установите awk для разделения ввода на разделителях слэшей, а затем повторно разделите на разделители пробелов, вы можете выбрать правильные поля:

 <infile awk '{ n=$2; FS=" +"; $0=$0; print n, $NF; FS="/" }' FS=/ 

GNU awk – использование описания поля FPAT

Если вы правильно описываете поля с помощью FPAT вы можете получить желаемые результаты. Вот пример, который работает с вашим вводом:

 <infile awk '{ print $1, $NF }' FPAT='[[:alnum:][:space:]]+' 

Вывод

 Columbia 0000815425 Columbia 0000815425 Columbia 0000815425 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 Dimensional Advisors 0000355437 

Вот альтернативное решение, связывающее ваши данные через tr и cut :

 …|tr ':' '/'|cut -d'/' -f2,5|tr -d '/' 

Первый tr заменяет : на / , так что cut может использовать / в качестве разделителя, чтобы изолировать последний столбец, как это уже делается для второго. Поскольку вы извлекаете несколько столбцов, cut будет содержать разделитель /, если вы не используете его --output-delimiter , но для этого просто сократите его, используя tr -d .

Если вы не хотите использовать несколько пространств, вы можете добавить канал через sed :

 …|sed 's/ */ /g'