Обновлено, чтобы найти USA
Не 1-я строка, как указано в вашем вопросе
Используя awk
, вы можете делать то, что вы пытаетесь, очень простым способом, например
$ awk -F'|' '/USA/ {for (i = NF; i >= 1; i--) printf "%s%s", $i, i==1 ? RS : FS}' cars.txt
USA|Ford|Michael
India|Maruti|Rahul
Пояснение
awk -F'|'
прочитать файл, используя '|'
в качестве Разделителя полей , указанного как -F'|'
вначало вызова, или как FS
внутри самой команды, /USA/
найти только строки, содержащие "USA"
, for (i = NF; i >= 1; i--)
- циклически перебирать поля в обратном порядке, printf "%s%s", $i, i==1 ? RS : FS
- вывести поле, за которым следует '|'
(FS
), если i
не равно 1
или Record-Separator (RS
), который по умолчанию равен "\n"
, если i
равен 1
.Форма test ? true_val : false_val
- это просто троичный оператор, который проверяет, если i == 1
, и если да, то предоставляет RS
для вывода, в противном случае предоставляет FS
для вывода.
Itбудет на несколько порядков быстрее, чем порождающие 8-оболочек с использованием подстановок команд , grep
и cut
(плюс трубы).
Только печать 1-е вхождение строкиСодержит "USA"
Чтобы напечатать только первую строку с "USA"
, все, что вам нужно сделать, это exit
после обработки, например,
$ awk -F'|' '/USA/ {for (i = NF; i >= 1; i--) printf "%s%s", $i, i==1 ? RS : FS; exit}' cars.txt
USA|Ford|Michael
Пояснение
- простое добавление
exit
в конец команды приведет к awk
прекращению обработки записей после первой.
В то время как оба awk
и sed
требуется немного времени, чтобы подружиться, вместе они предоставляют Unix-Swiss-Army-Knife для обработки текста.Стоит потратить время на изучение обоих.Это займет всего пару часов, чтобы получить хорошую основу, пройдя один из учебных пособий.Удачи в написании сценариев.