Почему мой текстовый файл отображает все мои поля как равные только одному полю? - PullRequest
0 голосов
/ 01 января 2019

Я использую bash для создания текстового файла с (теоретически) четырьмя полями: MD5, Timestamp, Hostname и Filepath.Каждое из этих полей находится прямо друг над другом, как показано в выходных данных ниже.Когда я выполняю следующую команду, у меня есть вывод, который возвращает 1 для каждого поля.

awk '{print NF, "- " $1}' best_file.txt

Вывод:

1 - md5:XXXXXXXX
1 - timestamp:XXXXXXXX
1 - endpoint:XXXXXXXX
1 - filename:XXXXXXXX
1 - md5:XXXXXXXX
1 - timestamp:XXXXXXXX
1 - endpoint:XXXXXXXX
1 - filename:XXXXXXXX

Я пытаюсь вырезать файл и упорядочить его, однако я выбираю эти четыре поля.Например, при использовании cut или 'awk' я не могу указать, какое поле cut или awk, потому что все это выглядит как 1 поле.

Я бы хотел иметь возможность отображать MD5 и имена хостов рядом друг с другом, или имена файлов и временные метки рядом друг с другом.Любая помощь, чтобы понять, почему все мои поля представлены как 1 поле будет оценена.Еще раз, я бы ожидал 4, но все это отображается как один ...

1 Ответ

0 голосов
/ 01 января 2019

Я произвел аналогичный вывод с best_file.txt, содержащим

md5:XXXX
timestamp:XXXX
endpoint:XXXX
filename:XXXX

Неясно, действительно ли эти имена ключей находятся в вашем источнике.Для файлов такого рода я не рекомендую.

В документации по print NF отмечено, что поля разделены пробелом .Измените первую строку этого значения на md5 XXXX и соответствующий вывод:

2 -  md5

, где print NF дает количество полей, $ 1 - первое поле и $ 2 - второе (выводит XXXX в этомдело).Таким образом, ваш файл имеет только одно разделенное пробелами поле на строку, что является проблемой, когда awk запускает эти команды один раз для каждой строки (записи).

Если это было 'md5: XXXX отметка времени: XXXX конечная точка: XXXX имя файла:XXXX ', тогда я мог бы запустить awk '{print NF ": " $1 " " $3}' best_file.txt, чтобы получить

4: md5:XXXX endpoint:XXXX

Конечно, это может быть не под вашим контролем.Вы можете:

1.Объединить группы строк в одну

Вы можете получить произвольное количество полей в одной строке с помощью awk '!(NR%4){print p " " $0, p=""}(NR%4){p=p " " $0}' best_file.txt (требуется некоторая корректировка, чтобы избавиться от начального пространства; Соединение двух последовательных строк с использованиемawk или sed объясняет команды).Тогда у вас может быть более полезный входной файл.

2.Поиск нужных строк

Добавляя более точные условия ко второму блоку этого фрагмента, вы можете выбрать, какие строки (поля) запоминать для печати. ​​

Оба подхода завершаются неудачно, еслив исходном файле где-то отсутствует строка.На самом деле для разбора ключей потребуется гораздо больше логики.

...