cut завершится ошибкой при запросе несуществующего поля. Вместо возврата "" он вернет саму строку. Пример: echo "aaaa" | cut -f2 результат - "aaaa", а не результат пустой нулевой длины.
ajaaskel
@ajaaskel Кажется, это происходит, когда разделитель не найден во вводе. И это поведение в настоящее время можно изменить, используя параметр --only-delimited.
Самули Пахаоджа
64
Альтернатива
N=3
STRING="one two three four"
arr=($STRING)
echo${arr[N-1]}
Использование массивов bash для этого - «лучшее» решение, я ненавижу использовать awk или sed, так как я не вижу, чтобы они были установлены на всех установках, особенно на установке msys.
Сундар
1
Несмотря на то, что эхо «не обязательно», я нашел его полезным для понимания того, как использовать элементы arr. Спасибо
Чен Ли Йонг
1
Если вы установили IFS(внутренний разделитель полей) на ':' или что-то вроде этого вместо пробела, измените его, прежде чем пытаться это сделать.
Noumenon
1
Это должен быть правильный ответ. Использовать для этой цели массивы просто и разумно.
ajaaskel
32
С помощью awk
echo$STRING | awk -v N=$N'{print $N}'
Контрольная работа
% N=3
% STRING="one two three four"
% echo$STRING | awk -v N=$N'{print $N}'
three
Альтернатива
N=3 STRING="one two three four" arr=($STRING) echo ${arr[N-1]}
источник
IFS
(внутренний разделитель полей) на ':' или что-то вроде этого вместо пробела, измените его, прежде чем пытаться это сделать.С помощью
awk
echo $STRING | awk -v N=$N '{print $N}'
Контрольная работа
% N=3 % STRING="one two three four" % echo $STRING | awk -v N=$N '{print $N}' three
источник
Файл, содержащий некоторые утверждения:
Результат:
Итак, чтобы вывести 4-е слово этого оператора, введите:
cat test.txt |awk '{print $4}'
Вывод :
источник
Ни дорогих вилок, ни труб, ни башизмов:
$ set -- $STRING $ eval echo \${$N} three
Но остерегайтесь глобусов.
источник
STRING=(one two three four) echo "${STRING[n]}"
источник