Извлечение части определенного столбца в текстовый файл

На Ubuntu 13.10 У меня была ошибка установки phpmyadmin:

Errors were encountered while processing:
 javascript-common

Когда я загрузил страницу в свой браузер, она появилась как:

error: json missing

ответьте здесь: https://superuser.com/questions/639945/how-to-fix-the-phpmyadmin-error-json-extension-is-missing.

1
задан 19 October 2015 в 18:19

3 ответа

Использование awk и нескольких разделителей

awk -F'[: ]' '{print $2}' in > out

Пример

$ cat in
ffmj0010.09o:FFMJ                                                  MARKER NAME
ffmj0020.09o:BRMU                                                  MARKER NAME

$ awk -F'[: ]' '{print $2}' in 
FFMJ
BRMU
3
ответ дан 23 May 2018 в 16:33
  • 1
    Гораздо лучший ответ awk, чем мой, забыл о нескольких разделителях! – AJefferiss 19 October 2015 в 17:23

Если вы уверены, что вам нужно ровно 4 символа перед концом строки, вы можете сделать:

grep -Eo '.{4}$' file.txt >out.txt

В противном случае вы можете перейти к grep с помощью PCRE, чтобы получить все символы после : до конца строки:

grep -Po '.*:\K[^:]+$' file.txt >out.txt

Вы также можете использовать расширение параметра bash:

while IFS= read -r line; do echo "${line##*:}"; done <file.txt >out.txt

EDIT:

Как @kos указал, что я, возможно, неправильно понял вопрос, если вы хотите ровно 4 символа после :, вы можете сделать:

grep -Po '.*:\K.{4}' file.txt >out.txt
3
ответ дан 23 May 2018 в 16:33

Используя grep:

cat oldFile | grep -o ":[A-Z]*" | grep -o "[A-Z]*" > newFile
cat oldFile |                                         # Read the file
               grep 
                    -o                                # Only give the greped data
                       ":[A-Z]*"                      # Find a : followed by 4
                                                      #  4 capital letters
                                 | grep -o "[A-Z]*"   # Remove the : from that

Затем > newFile выводит в файл.

На примере:

ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME

переходит в

FFMJ
BRMU
1
ответ дан 23 May 2018 в 16:33
  • 1
  • 2
    Вы можете упростить это до одной команды, добавив параметр -P и используя положительный внешний вид: grep -Po "(?<=:)[A-Z]*" oldFile > newFile – kos 19 October 2015 в 17:34
  • 3
    @kos Я не понимаю, как это работает, поэтому я оставлю это на этом. Это метод, по которому я собираюсь удалить ненужные строки (или получить нужные), но это полезный трюк. – Tim 19 October 2015 в 17:35
  • 4
    @ A.B. да, мое личное предпочтение - кошка. – Tim 19 October 2015 в 17:36
  • 5
    В основном это просто означает «если то, что преследует то, что следует за мной (me = (?<=:)), является символом :, тогда не отбрасывают это как несоответствие , но не матч меня ". Также в этом случае только grep -Po ":\K[A-Z]*" oldFile > newFile (\K = очистить то, что соответствует до сих пор). Это сэкономит вам одну команду: D – kos 19 October 2015 в 17:44

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

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