Як використовувати вирізаний для розділення на кілька пробілів?


23

Я хотів би отримати останній стовпчик цього зразка:

[  3]  1.0- 2.0 sec  1.00 MBytes  8.39 Mbits/sec
[  3]  2.0- 3.0 sec   768 KBytes  6.29 Mbits/sec
[  3]  3.0- 4.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  4.0- 5.0 sec   256 KBytes  2.10 Mbits/sec
...

Якщо я користуюся

cut -d\  -f 13

я отримав

Mbits/sec
6.29
4.19
2.10

тому що іноді є додаткові пробіли між ними.


Останній стовпець - Mbits/secце те, що ви хочете, або два останні стовпці?
terdon

1
Я хочу лише отримати другий останній стовпчик, тільки цифри
rubo77

Відповіді:


17

Щоб відповісти на ваше запитання буквально:

sed 's/   */:/g' | cut -d : -f 5

або

awk -F '  +' '{print $5}'

Але це не зробиться, якщо число в дужках досягне 10 тощо. Якщо вас цікавлять лише цифри, ви можете видалити все інше.

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6

так, впевнені лише цифри, але лише ваш третій приклад працює правильно
rubo77

@ rubo77 працює для мене. Перші два приклади роблять саме те, що ви запитуєте у своєму заголовку. Або ви хотіли також зняти пристрій? У цьому випадку додайте | sed 's/ .*//'наприкінці перших двох прикладів. Звичайно, існує багато інших способів зробити це.
Жил 'ТАК - перестань бути злим'

трохи коротше, +а не *: тест на кішку | sed 's / [^. 0-9] \ + /: / g' | скоротити -d: -f 6
rubo77

@ rubo77 Якщо ваш sed підтримує це, тобто. Він підтримується GNU та BusyBox, але не, наприклад, BSD або Solaris. POSIX вказує +і ?в ERE, але залишає \+та \?BRE невизначено.
Жил "ТАК - перестань бути злим"

22

Якщо ми використовуємо trкоманду разом із параметром стискання ( -sпрапор) для перетворення всіх декількох послідовних пробілів в єдиний простір, а потім виконуємо cutоперацію з пробілом як роздільник - ми можемо отримати доступ до необхідного стовпчика, що містить цифри.

Зверніться до фрагменту коду, наведеного нижче:

cat file | tr -s ' ' | cut -d ' ' -f 8


4
Ця відповідь повинна бути вищою; це , безумовно, найпростіше і найчитабельніше рішення.
Люк Девіс

5

Ці команди будуть друкувати останній стовпець файлу, розділеного пробілом:

  • awk '{print $NF}' file

    в awk, NF- це кількість полів і $NFє останнім полем.

  • perl -lane 'print $F[$#F]' file

    -aрозбиває файл на пробіл у масив @F, $#F- це кількість елементів у масиві, так $F[$#F]і останній елемент. У -nзасобі читання файлу , заданий в командному рядку і застосувати скрипт передається з -eкожним рядком. -lпросто додає символ нового рядка ( \n) до кожного printтвердження.

  • sed 's/.* //g'

    простий регулярний вираз, який відповідає всім останньому пробілу і видаляє його, залишаючи лише останній стовпець.

  • rev file | cut -d' ' -f 1 | rev

    revобертає результат, тому останнє поле є першим, cutз роздільником пробілу для друку та revповерненням тексту до нормального. Це не спрацює, якщо у вас є послідовний пробіл .

Виходячи з ваших даних, я здогадуюсь, що ви насправді не хочете останнього стовпця, а передостаннього одного або двох останніх. У цьому випадку використовуйте їх для друку останніх 2 ( 8.39 Mbits/sec):

awk '{print $(NF-1),$NF}' file 
perl -lane 'print "$F[$#F-1] $F[$#F]"' file 
sed 's/.* \(.* .*\)/\1/' file 
rev file | cut -d' ' -f 1,2 | rev

і вони для друку передостаннього ( 8.39):

awk '{print $(NF-1)}' file 
perl -lane 'print $F[$#F-1]' file 
sed 's/.* \(.*\) .*/\1/' file 
rev file | cut -d' ' -f 2 | rev

4

Ви не можете відокремити кілька випадків пробілів, використовуючи cutінструкцію:

Вихідні поля розділені одним явищем символу роздільника поля.

якщо текст не відокремлений однаковою кількістю або ви використовуєте trдля видалення надлишків.

В іншому випадку використовуйте альтернативні інструменти, такі як awk, sedабо ex.

Наприклад:

ex -s +'%norm $2Bd0' +%p +q! foo.txt

Замініть +q!на, -cwqщоб зберегти зміни на місці.


0

Використовуйте однолінійку Perl так:

perl -lane 'print $F[-2]' input_file

Пояснення:

Опція -eперекладач perl шукає сценарій вбудований, а не у файл.

Опція -nзмушує вхід (файл або STDIN з труби) читати рядок за рядком.

Опція -lзнімає роздільник запису вхідних даних (залежно від ОС, новий рядок у UNIX за замовчуванням) після зчитування рядка та додає його в кінці до кожногоprint

Опція -aпризводить до того, що кожен рядок введення розбивається на пробіл на масив @F, і $F[-2]це другий елемент, що рахується з кінця, що є полем, яке ви хочете. Ви також можете використовувати $F[$#F-1], де $#Fостанній індекс масиву @F, який трохи менш читабельний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.