2014-01-03 5 views
1

У меня есть огромный файл, из которого мне интересно получить несколько значений (длинные числа). Большую часть времени число начинается в конце строки и продолжается до начала следующей строки, и grep не может получить все это.как сказать grep, чтобы перейти к следующему

Например, мои цифры в таком виде: -1234.1234567 поэтому, когда я использую

grep -Eo '-[0-9]{4}.[0-9]{7}' 

он не возвращает все значения, потому что иногда числа идут так:

blah blah blah ....-1234.12 

34567 blah blah blah 

Так , есть ли способ сообщить grep продолжить поиск (если необходимо) следующей строки, чтобы получить все 7 десятичных чисел числа?

Благодаря

+0

забыл упомянуть, что у меня более 1000 файлов – nytrook

+0

Обратите внимание, что. в вашем RE соответствует любому символу, а не только периоду. Это то, что вы хотите? Кроме того, что бы вы хотели, если в вашем файле существовала строка типа hello-1234.1234567 или -1234.12345678 (т. Е. Какая-либо целевая строка должна быть ограничена чем-то)? Как вы знаете, когда 2 числа, разделенные новой строкой, должны оставаться 2 отдельными номерами или быть объединены? То же самое относится ко всем строкам цифр, разделенных ЛЮБОЙ пробел? –

ответ

0

Вы должны быть в состоянии удалить горизонтальные пропуски, а затем преформ ваш Grep.

Try: cat myfile | tr -d [:blank:] | grep -Eo '-[0-9]{4}.[0-9]{7}'

Если вы хотите сделать это для всех файлов в директории, которую вы могли бы просто использовать цикл:

for i in *; do cat $i | tr -d [:blank:] | grep -Eo '-[0-9]{4}.[0-9]{7}'; done 
+0

Спасибо. Однако это не сработало. Все еще не возвращали числа, которые продолжаются до следующей строки. – nytrook

+0

Исправлено, добавив [: blank:] к вашей команде tr. Однако есть ли способ сделать это более чем 1000 файлов одновременно? Спасибо – nytrook

+0

@ user3157486 Я думаю, вы можете использовать grep для поиска файлов в каталоге. Это будет то, что вы ищете? – SwankSwashbucklers

0

Это будет делать то, что вы просили (использует GNU AWK для ENDFILE):

gawk -v OFS=': ' ' 
{ rec = rec $0 } 
ENDFILE { 
    while (match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/)) { 
     print FILENAME, substr(rec,RSTART,RLENGTH) 
     rec = substr(rec,RSTART+RLENGTH) 
    } 
    rec = "" 
} 
' * 

Например:

$ cat file1 
blah blah blah ....-1234.12 

34567 blah blah blah 

blah blah blah ....-2345.2345 

678 blah blah blah 

$ cat file2 
blah blah blah ....-4321.12 

34567 blah blah blah 

blah blah blah ....-9876.2345 

678 blah blah blah 

$ gawk -v OFS=': ' ' 
{ rec = rec $0 } 
ENDFILE { 
    while (match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/)) { 
     print FILENAME, substr(rec,RSTART,RLENGTH) 
     rec = substr(rec,RSTART+RLENGTH) 
    } 
    rec = "" 
} 
' file1 file2 
file1: -1234.1234567 
file1: -2345.2345678 
file2: -4321.1234567 
file2: -9876.2345678 

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

Если у вас нет GNU awk, вы можете сделать то же самое с функцией, выполняющей функцию match(), вызываемую при FNR == 1 и в END. Существуют также различные альтернативы ....

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