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

Для этого можно использовать grep:

grep 56896 file.txt

Если вы хотите написать сценарий, это может быть что-то вроде этого:

#!/bin/bash

inputfile='/path/to/file.txt'

grep "$1" "$inputfile"

Который вы затем запустите как:

$./script.sh 56896
0
05.02.2020, 17:54
4 ответа

Нестандартный подход

awk -F'_' -v OFS='_' '{
    for (i=1; i<NF; i++) {
        if ($i ~ /^[[:upper:]]/ && $(i+1) ~ /^[[:lower:]]/) {
            print $i, $(i+1)
            break
        }
    }
}' file

Параметр breakобеспечивает печать только первого совпадения.

0
28.04.2021, 23:24
$ grep -o '[[:upper:]][[:alpha:]]*_[[:lower:]][[:alpha:]]*' file
Today_is
Doesnt_rain
Like_rainy

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

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

Следующая команда sedне имеет этой проблемы (вместо этого она будет вытягивать последнюю такую ​​строку в каждой строке):

$ sed -n 's/.*\([[:upper:]][[:alpha:]]*_[[:lower:]][[:alpha:]]*\).*/\1/p' file
Today_is
Doesnt_rain
Like_rainy
1
28.04.2021, 23:24

С реализацией grepс поддержкой PCRE и-o:

$ grep -P -o '(?<![^_])\p{Lu}[^_]*_\p{Ll}[^_]*' < your-file
Today_is
Doesnt_rain
Like_rainy

(вы можете заменить grep -Pна pcregrep, если ваш grepне поддерживает-P).

Это uстрочная буква L, за которой следует 0 или более не-_с, за которыми следует _, lстрочная Lстрочная буква и другая последовательность из 0 или более не-_s, все это соответствует только при условии, что оно не следует за не -_(, то есть следует за _или началом строки ).

Каждое совпадение будет напечатано на отдельной строке. Чтобы ограничить его первым совпадением в каждой строке, вы можете использовать другой подход:

grep -P -o '^(.*?_)??\K\p{Lu}[^_]*_\p{Ll}[^_]*' < your-file

Для последнего совпадения в каждой строке то же самое, но с использованием жадной версии операторов для части, которая съедает начальную часть:

grep -P -o '^(.*_)?\K\p{Lu}[^_]*_\p{Ll}[^_]*' < your-file
2
28.04.2021, 23:24
sed 's/.*\([A-Z][^_]*_[a-z][^_]*\).*/\1/' <your-file

РЕДАКТИРОВАТЬ :жадный sed дайте последний матч. awk-решение для первого совпадения:

awk '{match($0,/([A-Z][^_]*_[a-z][^_]*)/,a); print a[1]}' <your-file
0
28.04.2021, 23:24

Теги

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