использование grep для конкретных строк в текстовых файлах

     2              METEOROLOGICAL DATA                         VERSION /      
     8    PR    TD    HR    ZW    ZT    WD    WS    RI      # / TYPES OF   MOD/TYPE/ACC 
  3979316.8350  1050313.7180  4857065.7030      592.1910 PR SENSOR POS XYZ/H           
                                                            END OF HEADER 
 10  1  1  0  0 15  927.9    4.3   99.1                
 10  1  1  0  1 15  927.9    4.3   99.1                
 10  1  1  0  2 15  927.9    4.3   99.1                
 10  1  1  0 15 15  927.9    4.2   99.1               
 10  1  1  0 16 15  927.9    4.2   99.0                
 10  1  1  0 30 15  927.7    4.1   99.1                
 10  1  1  0 31 15  927.7    4.1   99.1                
 10  1  1  0 45 15  927.5    4.1   99.1                
 10  1  1  0 46 15  927.5    4.0   99.1                
 10  1  1  1  0 15  927.4    4.1   99.1                
 10  1  1  1  1 15  927.4    4.1   99.1                

В этом примере текстовых данных, как я могу извлечь все 0,15,30,45 в 5-м столбце числовых данных в надлежащем порядке, после"END OF HEADER"часть следующим образом;

10  1  1  0  0 15  927.9    4.3   99.1  
10  1  1  0 15 15  927.9    4.2   99.1 
10  1  1  0 30 15  927.7    4.1   99.1 
10  1  1  0 45 15  927.5    4.1   99.1
10  1  1  1  0 15  927.4    4.1   99.1 
3
задан 17 August 2016 в 13:47

3 ответа

Можно сделать это использование sed и awk:
(принятие Вашего подчиненного текста находится в файле, названном example.txt)

sed -n '/END OF HEADER/,${
/END OF HEADER/d
p
}' example.txt | awk '($5 == 0 || $5 == 15 || $5 == 30 || $5 == 45)'

Атрибуция - управление awk было принято от Объяснения комментария

steeldriver

, Sed

  • игнорирует все [до 114]
  • /END OF HEADER/d, средства удаляют строку, содержащую /END OF HEADER/ из пространства шаблона, и потому что больше в пространстве шаблона, следующая команда p ничего не сделает
  • , p - печатают каждую строку, поскольку это вытягивают в пространство шаблона

Awk

  • , если столбец 5 0 или 15 или 30 или 45 затем печать это
2
ответ дан 1 December 2019 в 13:12

Быстрый один лайнер был бы:

$ awk '$5 == '0' || $5 == '15' ||  $5 == '30' ||  $5 == '45' {print}' test.txt

Как fedorqui упомянутый в комментарии ниже и еще более быстрый один лайнер:

$ awk '$5 ~ /^(0|15|30|45)$/' test.txt

экс-наструганный Синтаксис:

$5  - the desired column from the text.
~   - the match symbol... matching was between the two slashes (/).
^/$ - the regex symbols indicating the beginning and end of the field.
|   - the or specifier for either item in the "()" group.

заголовок отфильтрован, только приняв строки, которые соответствуют объектам после соответствия ~ критерии.

4
ответ дан 1 December 2019 в 13:12

Это совершенно выполнимо в grep, хотя awk дежурный инструмент для разделенных данных поля.

С grep:

grep -E '^10[[:blank:]]+([^[:blank:]]+[[:blank:]]+){3}(0|15|30|45)[[:blank:]]' file.txt
  • Соответствие 10 в запуске, ([^[:blank:]]+[[:blank:]]+){3} соответствует следующим 3 полям и затем соответствию 5-му полю для желаемых

Если Вы используете PCRE (-P), можно заменить [:blank:] с \s, взгляды, хорошие на глазах:

grep -P '^10\s+([^\s]+\s+){3}(0|15|30|45)\s' file.txt     

Пример:

$ cat file.txt                                        
    2              METEOROLOGICAL DATA                         VERSION /      
    8    PR    TD    HR    ZW    ZT    WD    WS    RI      # / TYPES OF   MOD/TYPE/ACC 
 3979316.8350  1050313.7180  4857065.7030      592.1910 PR SENSOR POS XYZ/H           
                                                           END OF HEADER 
10  1  1  0  0 15  927.9    4.3   99.1                
10  1  1  0  1 15  927.9    4.3   99.1                
10  1  1  0  2 15  927.9    4.3   99.1                
10  1  1  0 15 15  927.9    4.2   99.1               
10  1  1  0 16 15  927.9    4.2   99.0                
10  1  1  0 30 15  927.7    4.1   99.1                
10  1  1  0 31 15  927.7    4.1   99.1                
10  1  1  0 45 15  927.5    4.1   99.1                
10  1  1  0 46 15  927.5    4.0   99.1                
10  1  1  1  0 15  927.4    4.1   99.1                
10  1  1  1  1 15  927.4    4.1   99.1    

$ grep -E '^10[[:blank:]]+([^[:blank:]]+[[:blank:]]+){3}(0|15|30|45)[[:blank:]]' file.txt
10  1  1  0  0 15  927.9    4.3   99.1                
10  1  1  0 15 15  927.9    4.2   99.1               
10  1  1  0 30 15  927.7    4.1   99.1                
10  1  1  0 45 15  927.5    4.1   99.1                
10  1  1  1  0 15  927.4    4.1   99.1                

$ grep -P '^10\s+([^\s]+\s+){3}(0|15|30|45)\s' file.txt                         
10  1  1  0  0 15  927.9    4.3   99.1                
10  1  1  0 15 15  927.9    4.2   99.1               
10  1  1  0 30 15  927.7    4.1   99.1                
10  1  1  0 45 15  927.5    4.1   99.1                
10  1  1  1  0 15  927.4    4.1   99.1        
3
ответ дан 1 December 2019 в 13:12

Другие вопросы по тегам:

Похожие вопросы: