Как найти подходящее слово в файле и напечатать слова этой строки в обратном порядке в Unix, используя скрипт? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь решить проблему, в которой мне дано несколько строк, например:

abdkfsj | kfjlds | james
sdlfjk | sfdjsldfjk | andrew
sdjfsdl | dskljoer | james

Мне было предложено найти строки, которые содержат Джеймс, и распечатать их в обратном порядке, как показано вышеПримером будет -

james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl

Может кто-нибудь сказать, пожалуйста, как решить эту проблему и какая команда будет использоваться для решения этого вопроса в Unix с использованием сценариев оболочки?

Попробовал это:

awk -F"|" '{ print $3 $2 $1}' | grep --line-buffered james input.txt 

Ответы [ 4 ]

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

Вы можете попробовать sed:

sed '/james/s/\([^|]*\)\( *| *\)\([^|]*\)\2\([^|]*\)/\4 \2\3\2\1/' infile
0 голосов
/ 10 февраля 2019

Ну, вы на самом деле на верном пути, просто нужно установить OFS, а также добавить условие:

awk -F'|' -v OFS="|" '/james/{print $3,$2,$1}' input.txt

Так что с помощью этой одной команды вы можете делать то, что вам не нужно передаватьgrep.

И если есть много столбцов, которые нужно повернуть вспять:

awk -F'|' '/james/{for(i=1;i<=NF/2;i++){j=NF-i+1;t=$i;$i=$j;$j=t}print}' OFS='|' input.txt

Здесь я использовал другой подход, на самом деле обмениваясь высокими столбцами с низкими столбцами и назначая OFS передвходные файлы, сохраненные необходимость -v.

Ну, если вы хотите сохранить пробелы тоже , используйте эти GNU awk решения:

awk -F' *[|] *' -v OFS=' | ' '/james/{print $3,$2,$1}' input.txt
james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl

$ awk -F' *[|] *' '/james/{for(i=1;i<=NF/2;i++){j=NF-i+1;t=$i;$i=$j;$j=t}print}' OFS=' | ' input.txt
james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl
0 голосов
/ 10 февраля 2019

Синтаксис команды grep, которая будет указана в качестве входных данных для awk, неверен.Это требует небольшой настройки и добавления OFS = "|"в НАЧАЛЕ делает свою работу.Проверьте это

 awk -F"|" 'BEGIN { OFS="|"} { print $3,$2,$1}' <(grep --line-buffered james divesh.txt)

со входами.

$ cat divesh.txt
abdkfsj | kfjlds | james
sdlfjk | sfdjsldfjk | andrew
sdjfsdl | dskljoer | james

$ awk -F"|" 'BEGIN { OFS="|"} { print $3,$2,$1}' <(grep --line-buffered james divesh.txt)
 james| kfjlds |abdkfsj
 james| dskljoer |sdjfsdl

$
0 голосов
/ 10 февраля 2019
awk '/james/{for (i=NF; i>1; i--) printf "%s%s", $i, FS; print $i}' file

Если строка содержит james, выведите ее столбцы в обратном порядке.

Вывод:

james | kfjlds | abdkfsj
james | dskljoer | sdjfsdl

Источник: https://stackoverflow.com/a/21944886/3776858

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...