У меня есть файл с именем input.txt, который содержит данные о студентах в формате StudentName|Class|SchoolName.
Shriii|Fourth|ADCET
Chaitraliii|Fourth|ADCET
Shubhangi|Fourth|ADCET
Prathamesh|Third|RIT
Я хочу отображать эти значения в обратном порядке для конкретного колледжа. Пример:
ADCET|Fourth|Shriii
ADCET|Fourth|Chaitraliii
Я использовал grep 'ADCET$' input.txt, который дает вывод
Shriii|Fourth|ADCET
Chaitraliii|Fourth|ADCET
Но я хочу в обратном порядке. Я также использовал grep 'ADCET$' input.txt | sort -r, но не получил требуемого результата
@WiktorStribiżew grep 'ADCET$' input.txt | tac поменял местами по вертикали. Это не ожидаемый результат.
@dth Файл input.txt содержит | разделенные значения, а не , разделенные значения.
| sed 's/^\([^|]*\)\(|.*|\)\([^|]*\)$/\3\2\1/'?
@WiktorStribiżew Это сработало. Можете ли вы дать подробное объяснение, чтобы я мог отметить его как правильный ответ.
Добавил все объяснения к ответу, рад, что это сработало для вас.





Вы можете использовать одно из следующих решений sed или awk:
grep 'ADCET$' input.txt | sed 's/^\([^|]*\)\(|.*|\)\([^|]*\)$/\3\2\1/'
grep 'ADCET$' input.txt | awk 'BEGIN {OFS=FS = "|"} {temp=$NF;$NF=$1;$1=temp;}1'
См. онлайн демо
awk подробности
BEGIN {OFS=FS = "|"} - разделитель полей установлен на | и для вывода будет использоваться тот же символ{temp=$NF;$NF=$1;$1=temp;}1:
temp=$NF; - последнее значение поля присваивается переменной temp$NF=$1; - в последнем поле установлено значение поля 1$1=temp; - значение поля 1 установлено в temp1 - заставляет awk записывать вывод.sed подробности
^ - начало строки\([^|]*\) - Группа захвата 1: любые символы 0+, кроме |\(|.*|\) - Группа захвата 2: |, затем любые символы 0+, а затем |\([^|]*\) - Capturing group 3: any 0+ chars other than|`$ - конец строки.\3\2\1 — это заполнители для значений, захваченных в группы 1, 2 и 3.
Возможно, вы увидите это: stackoverflow.com/a/13367179/1970049 для функции, которая переворачивает значения, разделенные запятыми (вы можете настроить свой разделитель с помощью регулярного выражения).