Как разобрать эти данные

326
Adrian Zhang

У меня есть файл, заполненный такими данными:

15-06-18 22:00 2968 

Каждая запись отделяется новой строкой. Я хочу извлечь последний номер (2968). Как я могу это сделать? (Я на Linux с bash).

Извините, если у меня нет правильных тегов / я пишу в неправильном месте. Я не уверен, где разместить этот вопрос.

0
Всегда ли число, которое вы хотите извлечь, сразу после второго пробела? fixer1234 6 лет назад 0
Если я вас правильно понимаю, да. Там никогда не бывает больше пробелов. Adrian Zhang 6 лет назад 0
Я предполагаю, что я просил вас надежно определить шаблоны персонажей; где именно это число всегда будет найдено. Это всегда четырехзначное число? Всегда ли это начинается с позиции 16-го символа? Всегда ли оно следует за `nn-nn-nn nn: nn`? Могут ли быть какие-либо исключения? fixer1234 6 лет назад 2
Пожалуйста, посмотрите на: [Что я должен делать, когда кто-то отвечает на мой вопрос?] (Http://superuser.com/help/someone-answers) Cyrus 6 лет назад 0
@ Кирс Ох. Правильно. Ха-ха, я забыл! Adrian Zhang 6 лет назад 0

5 ответов на вопрос

2
Cyrus

Распечатать последний столбец:

awk '' file 

Выход:

2968 

Переменная NFустанавливается на общее количество полей во входной записи. $ NF всегда содержит содержимое последнего столбца. Еще короче

awk '$0=$NF' file 
Переменная `NF` устанавливается на общее ** количество полей ** во входной записи. $ NF всегда содержит ** содержимое ** последнего столбца. Еще короче: `awk '$ 0 = $ NF' file` Cyrus 6 лет назад 0
1
Adrian Zhang

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

sed 's/^..............//' tmp.txt 

Спасибо, @ fixer1234!

Рад, что вы решили это. Кстати, по моим подсчетам, похоже, что вы хотите удалить только 15 символов; 16-е - это часть того, что вы хотите сохранить. fixer1234 6 лет назад 0
Хорошо, извини. Я исправил это. Adrian Zhang 6 лет назад 0
1
C0deDaedalus

Вы можете извлечь необходимые вам данные, используя awk, cutили sedдаже некоторые комбинации Grep с регулярным выражением.

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

15-06-18 22:00 2968 

Затем вы можете извлечь последний номер следующим образом:

awk '{ print $3 }' file_path 

И чтобы сохранить данные, вы можете перенаправить их в другой файл:

awk '{ print $3 }' file_path > new_file 

Как это устроено :

По сути, awk - очень мощный инструмент, используемый для манипулирования текстовыми данными. В твоем случае :

15-06-18 22:00 2968 

Выше строки можно рассматривать как 3 строки, разделенные spaceпромежуточным символом, а awk по умолчанию обрабатывает пробел как разделитель (заданный как -F).

Попробуйте поиграть с awk, попробуйте это с вашими данными, и вы поймете намного лучше.

awk -F: '{ print $2 }' your_file awk -F- '{ print $3 }' your_file 

Не стесняйтесь добавлять более подробно.

1
Krishna

Предполагая, что содержимое находится в файле с именем 'file', следует сделать следующее.

cut -d ' ' -f 3 file 

cut - это команда Unix. Со страницы руководства:

  • вырезать - удалить разделы из каждой строки файлов
  • -d говорит разделитель, чтобы использовать для резки.
  • -f какие поля выбрать.
  • file это исходный файл

результат идет на стандартный вывод.

`cut` - это команда` unix`. Со страницы man ... `cut - удалить разделы из каждой строки файлов`. `-d` говорит, что разделитель используется для резки. `-f` выбирает поле (я) (или столбцы) для вырезания. Krishna 6 лет назад 0
0
Ljm Dullaart

Или в bash:

#!/bin/bash  cat "$1" | while read day hour value ; do echo $value done 

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