Чи є спосіб змусити команду cut прочитати лише останнє поле?


13

У мене є відокремлений пробіл рядок, який виводиться командою, до якої я люблю передавати cut, використовуючи -fd ' 'для розділення на пробіли. Я знаю, що можу використовувати -f <n>для відображення номера поля <n>, але чи можу я змусити його відображати останнє поле, якщо я не знаю довжину рядка?

Або мені потрібно скористатися більш гнучким інструментом редагування тексту на кшталт sedабо awk?


Я думаю, що команда cut не може підтримувати, але не впевнена, чи спробували ви спробувати cut -d '' -f-?
αғsnιη

3
Інші способи зробити це: stackoverflow.com/questions/22727107 / ...
edwinksl

@KasiyA -nробить це n від початку, n-знаходиться від n до кінця, і є --complementваріант, який обертає вибір. Але жоден спосіб підрахувати кількість полів і діяти на ньому, наскільки я можу сказати.
Арронічний

Відповіді:


13

Ніхто cutне може цього зробити. Ви можете використовувати дві revкоманди, як-от

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

але зазвичай простіше у використанні awk:

echo 'foo bar baz' | awk '{print $(NF)}'

7

Це можна зробити, використовуючи лише оболонку, зовнішній інструмент не потрібен, використовуючи Розширення параметрів:

${var##* }

var##*відкине все від початку до останнього простору від параметра (змінної) var.

Якщо роздільником може бути будь-який пробіл, наприклад пробіл або вкладка, використовуйте клас символів [:blank:]:

${var##*[[:blank:]]}

Приклад:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

Я говорив про використання параметра розширення в коментарі до відповіді Северуса Тукса, але пустий символ символів є корисною інформацією, дякую.
Арронічний

4

Мені особисто подобається відповідь Флоріана Діше. Але є і такий шлях.

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

Пояснення:

wc -wдає кількість слів. і cutвирізає останнє слово

Редагувати:

Я придумав інший спосіб зробити це:

echo "Any random string here" | tac -s' ' | head -1

Правильно, але це правда, коли у розділі delim є пробіл або вкладка, і якщо ваш розріз не відрізняється, це не вдасться
αғsnιη

Хороше бічне мислення, хоча, якщо я встановлюю, a="my string here"я можу також використовувати розширення параметрів ${a##* }.
Арронічний

1
Так, але ОП заявив, що він має пробіл, розділений пробілом.
Северус Тукс

2

Ось одне використання grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

Як це працює:

  • grep з друком -oлише збігаються (не порожні) частини відповідного рядка.
  • Regexp [^ ]*$відповідає будь-якому, від кінця до тих пір, поки він не знайде пробілу.

Ще один лайнер від Глена Джекмана за допомогою perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.