awk столбцы для строк разбиваются на новую строку

На моей странице stats.txt меня есть следующее:

 Get-VMHardDiskDrive | Select-Object Path ComputerName : ACD-VMH04 Path : D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd VhdFormat : VHD VhdType : Dynamic Used Space : .07 Prov Space : 4.00 ComputerName : ACD-VMH04 Path : D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd VhdFormat : VHD VhdType : Dynamic Used Space : 258.04 Prov Space : 906.34 

Я запускаю следующую команду AWK чтобы дать мне следующее:

  • как создать файл данных со столбцом даты от дня1 до дня?
  • Как использовать команду awk для вычисления разницы дат между двумя столбцами в одном файле?
  • Удалить строку, содержащую первое появление «pattern1» после последнего появления «pattern2»?
  • сохраняйте только те столбцы в первом файле, которые их номера столбцов соответствуют номерам во втором файле
  • команда awk для разбора файла
  • Применение математической функции к каждой строке в большом файле
  •  ACD-VMH04 D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd VHD Dynamic .07 4.00 ACD-VMH04 D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd VHD Dynamic 258.04 906.34 

    В файле примерно 6 таких элементов, но в других файлах есть больше, поэтому мне интересно, как заставить вывод выглядеть так:

     ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd - VHD - Dynamic - .07 - 4.00 ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd - VHD - Dynamic - 258.04 - 906.34 

    Это несколько справится с этой задачей, но я не знаю, как это остановить и сделать новую строку, когда она попадает в пустую строку.

     awk -F " : " '{ ORS = " " } /Select-Object Path/ { output = 1; start = NR + 2 }; output && NR >= start { print $2, "-" }' stats.txt 

  • Конкатенация колонн горизонтально. Печать только строк, которые пересекаются в 1-й колонке
  • Как сделать tr знанием символов non-ascii (unicode)?
  • содержание grep между двумя стартовыми скобками
  • Сравните три файла: строки, присутствующие в одном, но не в другом, используя сравнение столбцов
  • Сценарий оболочки (bash) для добавления или замены текста лицензии, содержащегося в файлах .c, .h и makefiles?
  • Заменить первый столбец файла с помощью вывода команды
  • 2 Solutions collect form web for “awk столбцы для строк разбиваются на новую строку”

    У меня нет одного лайнера для вас, но ключевой концепцией здесь является сохранение поля, пока вы их не соберете, а затем распечатайте на одной строке. Также пустая строка будет иметь число полей (NF), равное нулю.

    Код:

     #!/bin/awk -f BEGIN {FS = " : "; OFS = " - "} NF > 0 { gsub(/[ ]+$/, "", $1) a[$1] = $2 } NF == 0 {dump()} END {dump()} function dump() { print a["ComputerName"], a["Path"], a["VhdFormat"], a["VhdType"] } 

    Результаты:

     ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd - VHD - Dynamic ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd - VHD - Dynamic 
     perl -lne ' /Select-Object Path/ and !$a++ and <>,next; /^ComputerName\s+:/ && $a .. /^$/ || eof and do{ push @A, (/\s+:\s+\K(.*)/)[0] if /^ComputerName\s+:/ || /./; print join(" - ", splice(@A,0,@A)),"\n" if /^$/ || eof; }; ' stats.txt 

    Вывод

     ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd - VHD - Dynamic - .07 - 4.00 ACD-VMH05 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd - VHD - Dynamic - 258.04 - 906.34 
    Linux и Unix - лучшая ОС в мире.