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

Кевин в комментариях к вопросу предложил использовать vlc-wrapper.У меня были проблемы с тем, как его использовать, поэтому я опишу, как я заставил его работать:

вам нужно установить непривилегированного пользователя в SUDO_UID: export SUDO_UID=1000

если у вас нет пользователя для запуска vlc под создайте его:

useradd -g users vlc
# this will show you the uid of vlc user
id -u vlc

если вы хотите, чтобы переменная SUDO_UID была постоянной, добавьте ее в bashrc:

echo "export SUDO_UID=1000" >> /root/.bashrc

будьте осторожны, чтобы не написать одиночный > вместо > >

затем используйте vlc-wrapper вместо vlc

0
24.04.2017, 15:16
3 ответа

С sedвы можете сделать

sed '/^#/!s/\([^ ]* *\)\{18\}[a-z]*\([A-Z]\).*/&  \2/'

Это для всех строк, не начинающихся с #(/^#/! селектор ), после 18 комбинаций не пробелов и пробелов пометить заглавную букву \(\)для последующего обращения к ней, "заменить" всю строку самой собой и добавить пробелы с найдена заглавная буква.

Если вы предпочитаете расширенные регулярные выражения, вы также можете использовать

sed -E '/^#/!s/([^ ]* *){18}[a-z]*([A-Z]).*/&  \2/'

Если столбцы разделены табуляцией вместо пробелов, вы выбираете

sed -E '/^#/!s/([^\t]*\t){18}[a-z]*([A-Z]).*/&\t\2/'
0
28.01.2020, 02:16

Чтобы ответить на ваш буквальный вопрос о том, как это сделать с помощью grep в одиночку. Несмотря на то, что grep не был разработан для этого, с GNU grep и построенным с поддержкой PCRE, вы можете сделать:

grep -Po '(?:^(?:[^\t]*\t){18}|\G)[^\t]*?\K[[:upper:]]'

Это поиск 18 последовательностей < not-TABs> в начале строки или в конце предыдущего совпадения (\G), за которым следует наименьшее возможное количество символов без табуляции (так что мы по-прежнему в 19-м поле), за которым следует заглавная буква, но с помощью \K мы сбрасываем начало совпадающей части непосредственно перед этой заглавной буквой.

Таким образом, при вводе типа:

X<tab>X<tab>....<tab>AbC<tab>X<tab>...

Он сообщит:

A
C

Как с вашим вырезом | подход grep.

Если вас интересует только первый символ верхнего регистра в 19-м поле, вы можете упростить его до:

grep -Po '^(?:[^\t]*\t){18}[^\t]*?\K[[:upper:]]'

Чтобы вставить его как 20-й столбец, вы можете сделать:

paste <(cut -f1-19 < file) <(grep ...above < file) <(cut -f20- < file) > newfile

Или чтобы вставить его в качестве последнего столбца:

grep... < file | paste file - > newfile
1
28.01.2020, 02:16

is there any option or parameter in grep to specify a column?

grepне имеет опцииразделителя полей .
Вместо этого используйте следующий подход awk :

awk -F'\t' -v OFS='\t' '{match($19,/[A-Z]+/); $20=substr($19,RSTART,RLENGTH) FS $20}1' 1.table

match($19,/[A-Z]+/)-захватывает прописные буквы в 19-м поле

$20=substr($19,RSTART,RLENGTH) FS $20-извлекает совпадающие прописные буквы из 19 го поля и вставляет их как значение 20 го поля

4
28.01.2020, 02:16

Теги

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