2016-02-20 4 views
-3

Было сложно сформулировать вопрос, лучше я покажу пример. Txt файл имеет следующие строкиГреп-строка, если она имеет несколько совпадений

city:state:address 
city:state 
city: 

Мне нужно извлечь строки, где

a) only one occurrences of : 
b) only one occurrences of : and has value after : 
c) two occurrences of : 

и поместить эти строки в отводящие файлы, так что один файл будет содержать все строки с city:state:address секунды с city:state третьего city:

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

ответ

3

Используйте эти инвокации Grep и конвейерный вывод в различные файлы:

  1. grep -E "^[^:]+:\s*$" file.txt
  2. grep -E "^[^:]+:[^:]+$" file.txt
  3. grep -E "^[^:]+:[^:]+:.*$" file.txt

Он ищет что-то, что не : с регулярным выражением [^:]+ , Он использует ^ и $ в начале и в конце, чтобы соответствовать всей строке ввода.

3

Это работа для awk, а не grep. Все что вам нужно:

awk -F':' ' 
    NF==3 { print > "file_c"; next } 
    { print > ($2=="" ? "file_a" : "file_b") } 
' file 

и это создаст все файлы, которые вы хотите за один проход от вашего входного файла.

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

NF==3   { print > "file_c" } 
    NF==2 && $2=="" { print > "file_a" } 
    NF==2 && $2!="" { print > "file_b" } 
Смежные вопросы