Извлечение слова из файла с использованием grep или sed - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть файл в следующем формате:

File                  : \\dvtbbnkapp115\nautilus\030db28a-f241-4054-a0e3-9bfa7e002535.dip was
 processed. 
Entries Found         : 0
Unarchived Documents  : 1 
            File Size : 1 K 

Error : The following line could not be processed.  Bad Document Type.

Error : Marketing and Contact preference change
        update||7000003735||078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.pdf



File                  : \\dvtbbnkapp115\nautilus\078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.dip was
 processed. 
Entries Found         : 0
Unarchived Documents  : 1 
            File Size : 1 K 

Error : The following line could not be processed.  Bad Document Type.

Error : Declined - Bureau Data (process)||7000003723|252204|2f1d71f4-052c-49f1-95cf-9ca9b4268f0c.pdf



File                  : \\dvtbbnkapp115\nautilus\2f1d71f4-052c-49f1-95cf-9ca9b4268f0c.dip was
 processed. 
Entries Found         : 0
Unarchived Documents  : 1 
            File Size : 1 K 

Error : The following line could not be processed.  Bad Document Type.

Error : Unable to call - please
        contact|40640510016710|7000003180||3e6a792f-c136-4a4b-a654-37f4476ccef8.pdf

Мне нужно извлечь только имена файлов pdf после двойной трубы и записать их в файл.Я новичок, когда дело доходит до команд unix / sed / grep, я пробовал, но не повезло?какие-нибудь идеи или примеры, которые я мог бы использовать, чтобы извлечь информацию выше?

спасибо

Ответы [ 5 ]

1 голос
/ 10 февраля 2011

Попробуйте, если вы хотите, чтобы имена файлов PDF отображались только в том случае, если они следуют за символами двойной трубы и являются последними в строке:

sed -n 's/.*||\([^|]*.pdf\)$/\1/p' inputfile

Второе имя файла PDF в вашем примере следует за одним символом канала, но в этой строке есть более ранний набор двойных каналов. Это должно учитывать оба стиля линий, если имя файла - это та часть, которая не содержит символов канала:

sed -n 's/.*||.*|\([^|]*.pdf\)$/\1/p' inputfile

Если ваши имена файлов состоят только из шестнадцатеричных цифр и дефисов, вы можете быть немного более избирательными, как это:

sed -n 's/.*||.*|\([[:xdigit:]-]*.pdf\)$/\1/p' inputfile
0 голосов
/ 10 февраля 2011

Рубин (1,9 +)

$ ruby -F'\|\|' -ane 'print $F[-1] if $_["\.pdf"] && !$F[1].include?("|") ' file
078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.pdf
3e6a792f-c136-4a4b-a654-37f4476ccef8.pdf
0 голосов
/ 09 февраля 2011

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

grep -o '||[^|]*\.pdf' YOUR_FILE | tr -d '|'

РЕДАКТИРОВАТЬ: я удалил $ {...}, чтобы сделать его более читабельным.

0 голосов
/ 09 февраля 2011

Почему бы просто не отправить свой вклад через sed?Как это:

sed -n -e '/\|\|.*pdf$/ { s/.*\|\|//; p; }'
0 голосов
/ 09 февраля 2011

Если я правильно понял ваш запрос, он должен это сделать:

grep -o -E "\|\|[^\|]*.pdf" < input | cut -f 3 -d "|"

grep ищет строки, содержащие двойные трубы, за которыми следует pdf-имя.cut, 'разрезает' линию на основе разделителя и выбирает n-ное поле.

Чтобы получить все PDF-файлы, которые находятся на линии с двойной трубкой (не только после них):

grep "||" < input | cut -f 5 -d "|" > output

Редактировать: после просмотра комментария я думаю, что вы хотели что-то еще, поэтому я настроилответ.Ставить оба ответа так, как кажется, это простой случай ...

...