Последнее поле в word1,word2,word3,a,b,c,d,e
— e
, а третье поле — word3
. Похоже, вам нужна часть строки, начинающаяся с третьего поля. Это проще с cut
:
$ echo word1,word2,word3,a,b,c,d,e | cut -d , -f 3-
word3,a,b,c,d,e
-f 3-
равно -f xy
для полей от x до y, но с y
опущено, так что это от 3 ряддо последнего поля.
Обратите внимание, что предполагается, что строки содержат как минимум 3 поля. Это дало бы пустые строки вывода для строк ввода, содержащих 2 поля, и оставило бы строку нетронутой, если она не содержала запятую (вы можете добавить опцию -s
, чтобы пропустить строки без разделителей):
$ printf '%s\n' a a,b a,b,c a,b,c,d | cut -d , -f 3-
a
c
c,d
$ printf '%s\n' a a,b a,b,c a,b,c,d | cut -sd , -f 3-
c
c,d
С awk
вы можете сделать:
$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,[^,]*,/, "")'
c
c,d
(хотя вариант awk 'sub(/^([^,]*,){2}/, "")'
POSIX менее переносим, так как все еще существует несколько awk
реализаций, которые не поддерживают {x,y}
оператор регулярного выражения)
Чтобы удалить первые 2 поля (и выводить только те строки, где они были удалены), хотя это будет использовать awk
как прославленный sed
, так как это то же самое, что и sed -n 's/^[^ ,]*,[^,]*,//p'
.
Или:
$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,?[^,]*,?/, "")'
c
c,d
для печати пустой строки для строк, содержащих менее 3 полей.