Ищите строку и печатайте строку в другом порядке, используя Linux - PullRequest
0 голосов
/ 24 февраля 2019

Мне нужно написать скрипт оболочки, который выполняет следующее, которое я покажу ниже с примером.

Предположим, у меня есть файл cars.txt, который изображает таблицу, подобную этой Person|Car|Country '|'это разделитель.Таким образом, первые две строки выглядят так:

Michael|Ford|USA
Rahul|Maruti|India 

Я должен написать скрипт оболочки, который найдет строки в файле cars.txt, в котором указана страна как США, и напечатает его как

USA|Ford|Michael

Я не очень разбираюсь в Unix, поэтому мне нужна помощь здесь.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Обновлено, чтобы найти 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 для обработки текста.Стоит потратить время на изучение обоих.Это займет всего пару часов, чтобы получить хорошую основу, пройдя один из учебных пособий.Удачи в написании сценариев.

0 голосов
/ 24 февраля 2019

Будет ли это делать?

while read -r i; do
  NAME="$(cut -d'|' -f1 <<<"$i")"
  MAKE="$(cut -d'|' -f2 <<<"$i")"
  COUNTRY="$(cut -d'|' -f3 <<<"$i")"
  echo "$COUNTRY|$MAKE|$NAME"
done < <(grep "USA$" cars.txt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...