Поскольку awk не поддерживает обратные ссылки в регулярном выражении, лучше использовать для этого grep или sed:
$ grep '^[^[:space:]]*\([a-z]\)\1' file
Viijay 2
$ sed -n '/^[^[:space:]]*\([a-z]\)\1/p' file
Viijay 2
Это может быть только для GNU, проверьте Google.
С помощью awk вам нужно будет сделать что-то вроде следующего, чтобы сначала создать регулярное выражение, которое соответствует 2 повторениям любого символа в вашем указанном c наборе символов a-z
:
$ awk '{re=$1; gsub(/[^a-z]/,"",re); gsub(/./,"&{2}|",re); sub(/\|$/,"",re)} $1 ~ re' file
Viijay 2
FYI для создания регулярное выражение из $1
, которое будет соответствовать 2 повторениям любого символа, который он содержит, а не только a-z
, будет:
re=$1; gsub(/[^\\^]/,"[&]{2}|",re); gsub(/[\\^]/,"\\\\&{2}|",re); sub(/\|$/,"",re);
Вы должны обрабатывать ^
иначе, чем другие символы, так как это единственный символ, который имеет значение, отличное от буквального, когда это первый символ в выражении в скобках (т.е. отрицание), поэтому вам нужно экранировать его с помощью обратного слэ sh, а не помещать его в выражение в скобках, чтобы сделать его буквальный. Вы должны обрабатывать \
иначе, потому что [\]
означает то же самое, что и []
, который является неопределенным выражением в скобках, потому что [
- это начало, а ]
- это только первый символ внутри выражения в скобках, это не ]
необходимо прекратить.