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 чтобы дать мне следующее:

 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 

  • Работа с столбцами - awk и sed
  • Как заменить m часть строк на n часть строк?
  • Bash для замены некоторых слов, присутствующих в одном файле из другого файла
  • Копирование слов из строк и добавление к строкам в другом файле
  • Как найти конкретную строку и распечатать всю строку?
  • Как распечатать разницу между максимальным и минимальным значением записи?
  • gawk присоединяется к двум TSV по столбцам (a'la sql join)
  • Если Else в Gawk
  • 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 - лучшая ОС в мире.