Изменение формы файла, разделенного вкладками

Три ответа здесь относятся к nmap, но я нашел префикс sudo(, которого нет ни в одном из ответов ), который имеет все значение в мире:

$ nmap -sP 192.168.1.0/24

Starting Nmap 7.01 ( https://nmap.org ) at 2019-07-13 14:55 MDT
Nmap scan report for 192.168.1.65
Host is up (0.00037s latency).
Nmap scan report for 192.168.1.66
Host is up (0.00035s latency).
Nmap scan report for 192.168.1.67
Host is up (0.00028s latency).
Nmap scan report for 192.168.1.68
Host is up (0.00025s latency).
Nmap scan report for 192.168.1.70
Host is up (0.017s latency).
Nmap scan report for 192.168.1.254
Host is up (0.00070s latency).
Nmap done: 256 IP addresses (6 hosts up) scanned in 6.86 seconds

$ sudo nmap -sP 192.168.1.0/24

Starting Nmap 7.01 ( https://nmap.org ) at 2019-07-13 14:56 MDT
Nmap scan report for 192.168.1.65
Host is up (0.00050s latency).
MAC Address: 99:99:99:99:99:A6 (Unknown)
Nmap scan report for 192.168.1.66
Host is up (0.00016s latency).
MAC Address: 99:99:99:99:99:D9 (Sony)
Nmap scan report for 192.168.1.70
Host is up (-0.087s latency).
MAC Address: 99:99:99:99:99:36 (Unknown)
Nmap scan report for 192.168.1.254
Host is up (0.0020s latency).
MAC Address: 99:99:99:99:99:00 (Actiontec Electronics)
Nmap scan report for 192.168.1.67
Host is up.
Nmap scan report for 192.168.1.68
Host is up.
Nmap done: 256 IP addresses (6 hosts up) scanned in 2.41 seconds

Я наткнулся на этот вопрос и ответ, потому что я исследую проект по отображению на устройствах удобочитаемых имен, а не IP-адресов и MAC-адресов, закодированных компьютером.

В частности, я хочу, чтобы "Toshiba 43" 4K TV" отображалось, а не "(неизвестно )" для MAC99:99:99:99:99:36(ненастоящего адреса )выше.

Позже я хочу расширить проект за пределы локальной сети в Интернет, где «Stack Exchange » будет отображаться вместо 999.999.9.99или «Ask Ubuntu » будет отображаться вместо 999.999.9.99когда я просматриваю внешние IP-адреса, с которыми взаимодействует моя машина.

0
19.05.2021, 12:52
2 ответа

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

И мне очень нравится csvkit и особенно GoCSV для декларативной конвейерной обработки.

Преобразовать/установить -вверх

Первым шагом является преобразование данных примера фиксированной -ширины в CSV. csvkit позволяет указать схему ширины столбца -...

схема.csv

column,start,length
Time,0,4
Flag,7,13

, а затем конвертировать в CSV:

in2csv -s schema.csv input.txt > input.csv

Разделение и транспонирование

Я хочу разделить ввод по флагам категории :и времени. А затем для каждой категории создайте набор из одной -строки CSV (для переноса на следующем шаге):

gocsv filter -c 2 --regex "^[01]$" input.csv | 
gocsv split --max-rows 1 --filename-base flags

и для дополнительных таймингов используйте тот же шаблон с--exclude:

gocsv filter -c 2 --regex "^[01]$" --exclude input.csv | 
gocsv split --max-rows 1 --filename-base times

Это создает набор файлов, например:

ls flags-*.csv                                     
flags-1.csv  flags-2.csv  flags-3.csv  flags-4.csv

и каждый выглядит примерно так:

флаги -1.csv

Time,Flag
1.00,0

или:

раз -4.csv

Time,Flag
0.57,1.140746e+00

Заголовок Time,Flagне очень важен, но важно убедиться, что он есть и повлияет на структуру после транспонирования.

Для каждого из этих файлов повторите :транспонирование, выбрав второй столбец (, поскольку фиктивный заголовок становится первым столбцом ), и закройте -ping с соответствующим заголовком:

for FILE in flags-*; do 
  gocsv transpose $FILE | 
  gocsv select -c 2 | 
  gocsv cap --names Flag \
  > trans_$FILE; 
done

for FILE in times-*; do
  gocsv transpose $FILE |
  gocsv select -c 2 |
  gocsv cap --names Time \
  > trans_$FILE;
done

Сложить в столбцы

Сложите флаги и время в отдельные столбцы:

gocsv stack trans_flags*  > col_flag.csv

gocsv stack trans_times*  > col_time.csv

А затем заархивируйте вместе (, и я просто собирался использовать csvlook для более красивой таблицы Markdown, но она также нормализовала числа!):

gocsv zip col_time.csv col_flag.csv > output.csv
csvlook output.csv
Время Флаг
0,650… 1
0,589… 0
0,560… 0
0,585… 0
0,580… 1
0,528… 1
0,570… 0
1,141… 0

это мило.

Но вот последний шаг с использованием встроенных в GoCSV -в (и новых -в -меня )шаблонов SPRIG и функции roundдля очистки чисел с плавающей запятой, целых чисел и научной нотации. Я добавляю новые столбцы на основе оригиналов, затем выбираю только новые/отформатированные столбцы:

cat output.csv |
gocsv add -n Time -t "{{round.Time 2}}" |
gocsv add -n Flag -t "{{round.Flag 0}}" |
gocsv select -c 3- |
gocsv tsv

и получаем:

Time    Flag
0.65    1
0.59    0
0.56    0
0.58    0
0.58    1
0.53    1
0.57    0
1.14    0
0
28.07.2021, 11:30
$ awk 'NR > 1 { d[++n] = $1; d[++n] = $2 } END { print "Time", "Flag"; for (i = 1; 2*i <= n; ++i) printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS }' file
Time Flag
0.65 1
0.59 0
0.56 0
0.58 0
0.58 1
0.53 1
0.57 0
1.14 0

Код awkсчитывает все данные по строке -в последовательные элементы в массиве d(, пропуская заголовок ).

В блоке ENDпечатается заголовок, затем мы итерируем с iот 1 до половины длины нашего массива d, печатая значение по индексу i(, значение времени )и вn/2 + i(значение флага ). Форматирование вывода выполняется таким образом, что значение времени печатается как значение с плавающей запятой с двумя десятичными знаками, а значение флага печатается как целое число.

Переменные OFSи ORSсодержат поле вывода по умолчанию и разделители записей (пробел и новую строку по умолчанию ). Для вывода с разделителями табуляции -используйте awk -v OFS='\t' '{... }' file.

Для справки: код awkкак свободный -постоянный скрипт:

#!/usr/bin/awk -f

NR > 1 {
    d[++n] = $1
    d[++n] = $2
}

END {
    print "Time", "Flag"

    for (i = 1; 2*i <= n; ++i)
        printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS
}
2
28.07.2021, 11:30

Теги

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