Как выполнить обработку текста во 2-й строке CSV и добавить конкретный результат обработки строки в новый столбец CSV с помощью сценария оболочки?

Выполнить:

avahi-resolve -a <IP> | cut -f 2

Это вернет список имен хостов (по одному на -строку ), зарегистрированных в mDNS для IP-адреса, который вы передали. Если вы передадите свой собственный локальный IP-адрес, он вернет то, что вы зарегистрировали. При нормальных обстоятельствах он должен возвращать ровно одну строку с вашим локальным именем хоста (или любым дополнительным именем хоста, если были коллизии ).

Если вы удалите команду cutв конце, вы можете просто самостоятельно проанализировать строки в своем собственном коде, разделив первый символ табуляции и взяв вторую часть каждой строки.

Кроме того, может быть какой-то вызов, который вы можете сделать на DBus, чтобы получить эту информацию, но если и есть, то я не нашел никакой информации об этом.

1
20.09.2019, 17:51
2 ответа

Чтобы упростить решение, а также из-за того, что ваши строки заголовка не согласованы (новая строка во входном файле и неправильный разделитель ~в выходном файле ), давайте предположим, что ваш входной файл не содержит строки заголовка.

Можно решить задачу в два шага:

  1. Создайте файл checksums.csv, нам нужен только путь к файлу:

    awk -F'~' '{ system("cksum /opt/xyz"substr($2,8)) }' file.csv > checksums.csv
    

    substr($2,8)удаляет префикс store:/, а /opt/xyzдобавляется для завершения пути. Команда system(…)выполняет команду cksumпо заданному пути, и вывод перенаправляется в выходной файл.

    Пример вывода будет выглядеть так:

    $ cat checksums.csv
    128361894 41 /opt/xyz/2018/7/20/11/35/3f176f4b-41a0-4ac4-a795-a2240ffbb7b9.bin
    820470222 41 /opt/xyz/2018/7/20/11/35/4302b390-1134-424d-a92f-ad27b233e8c1.bin
    1593587341 41 /opt/xyz/2018/7/20/11/35/5ff59679-b3ec-46d2-aa7d-5ec28eff6fe9.bin
    

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

  2. Напечатайте строку заголовка и объедините столбец 1 (имя файла )из file.csvс столбцом 3 (путь )и столбец 1 (контрольная сумма )из checksums.csv.

    { echo "filename contenturl checksum";\
      paste -d ' ' <(awk -F'~' '{ print $1 }' file.csv) <(awk '{ print $3,$1 }' checksums.csv);\
    } > newfile.csv
    

    Пример вывода:

    $ cat newfile.csv
    filename contenturl checksum
    000224.pdf /opt/xyz/2018/7/20/11/35/3f176f4b-41a0-4ac4-a795-a2240ffbb7b9.bin 128361894
    000238.pdf /opt/xyz/2018/7/20/11/35/4302b390-1134-424d-a92f-ad27b233e8c1.bin 820470222
    000262.pdf /opt/xyz/2018/7/20/11/35/5ff59679-b3ec-46d2-aa7d-5ec28eff6fe9.bin 1593587341
    

    Затем очистить:

    rm checksums.csv
    
0
28.01.2020, 00:00

GNU sedимеет флаг eдля команды s, позволяющий вам интегрировать обработку оболочки, такую ​​как cksum, в ваш скрипт:

sed -E 'h;s_.*~store:/([^~]*).*_cksum /opt/xyz\1_e;x;G;s_~[^~]*(.*)\n(.*).* (.*)_~\2~\3\1_;s/~/  /g'
  • опция -Eпереключает на расширенные регулярные выражения для лучшей читабельности
  • hсохраняет текущую строку в резервной области, поэтому мы можем ее испортить
  • s_.*~store:/([^~]*).*_cksum /opt/xyz\1_eсоответствует всему, включаяstore:/(для удаления ), имя файла внутри ()для повторного использования как \1и остальную часть строки (для удаления )и заменяет ее на cksum+ путь. Теперь флаг eвступает в действие, чтобы выполнить эту команду и заменить пространство шаблонов тем, что возвращается
  • x;Gменяет местами удержание и пространство шаблонов, а затем добавляет удержание к пространству шаблонов, поэтому буфер содержит
  • s_~[^~]*(.*)\n(.*).* (.*)_~\2~\3\1_может потребоваться для чтения, но легко записать:~[^~]*— это второе поле, (.*)\nостальная часть исходной строки и (.*).* (.*)три поля, возвращаемые cksum, поэтому второе поле получает заменяется именем файла и контрольной суммой
  • Вы не написали это в своем вопросе, но в примере у вас не ~в качестве разделителя, а два пробела:s/~/ /g
0
28.01.2020, 00:00

Теги

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