Что смотрит монитор устройства ввода?

Вы можете сделать это с помощью Perlс помощью функции unpack, создав шаблон распаковки динамически, изучив заголовок (1-я строка):

perl -lpe '
    $fmt //= join "", map("A". length(), /\H+\h+(?=\H)/g), "A*";
    $_ = join ",", map { s/"/""/gr =~ s/(.*)/"$1"/r } unpack $fmt;
' input-file.txt

Пояснение:

  • -pзаставит perlпотреблять файл на основе -строк. Каждая строка, также известная как запись, обозначается как $_. Другой эффект -pзаключается в том, что он автоматически печатает текущую запись, прежде чем перейти к выборке следующей.
  • -lделает 2 вещи, устанавливаетORS = RS = \n
  • Регулярное выражение /\H+\h+(?=\H)/gдолжно извлекать все поля, кроме последнего, а затем они передаются в map.
  • mapвычисляет длины этих полей и добавляет к каждому префикс «А».
  • Вместо того, чтобы не выбирать последнее поле выше, мы добавляем ловушку -all "A *".
  • Затем они передаются в join, который склеивает их вместе в строку, используя нулевой разделитель. Таким образом, формат распаковки готов к использованию и больше не вычисляется из-за оператора //=, который является функцией defined-or.
  • Теперь, вооружившись динамически созданным форматом распаковки, мы приступаем к применению к каждой строке, включая заголовок.
  • unpackраспаковывает строку, в нашем случае текущую строку, используя предоставленный формат, и выдает распакованные поля.
  • Эти испускаемые поля затем вводятся в map, который работает с каждым -за -единицей и выполняет шаги, описанные в коде {... }. В нашем случае в каждом поле мы делаем следующее :a )удваиваем двойные кавычки. b )заключите поле в двойные кавычки.
  • После того, как mapзакончит редактирование полей, он перебрасывает их в join, который объединяет их с помощью запятой ,и формирует небольшой CSVфайл.
  • П.С.: Обратите внимание, что нам не нужно было обрезать конечные пробелы в полях, сгенерированных unpack, потому что unpackделает это за вас при использовании символа форматированияA(A для ASCII ).

Выход:

"Id","Name","Type","Size","Created"
"1sV3_a1ySV0-jbLxhA8NIEts1KU_aWa-5","info.pdf","bin","10.0 B","2018-08-27 20:26:20"
"1h-j3B5OLryp6HkeyTsd9PJaAtKK_GYyl","2018-12-ss-scalettapass","dir","","2018-08-27 20:26:19"

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

if="input-file.txt"
cmd=$(< "$if" head -n 1 | perl -lne 'print join $/, reverse map { $s += length();qq[s/./\\n/$s] } /\H+\h+(?=\H)/g')
sed -e '
    '"${cmd}"'
    s/"/""/g
    s/[[:blank:]]*\n/","/g
    s/.*/"&"/
' < "$if"
0
28.06.2021, 12:49
0 ответов

Теги

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