Cambiar el orden de las palabras en línea

Cambiar el orden de las palabras en línea

Estoy intentando imprimir un archivo con los nombres de los estudiantes.

muhaz:x:6541:113:AhmmedMuhaz Mohammed Kunhi Mulleria:/home/students/muhaz:/bin/bash

Necesito que mi salida sea así:

muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash

Esto es lo que he probado pero no funciona en absoluto.

cat /etc/passwd | tail -n 20 | sed -r 's/.*[[:alpha:]]+([[:blank:]][[:alpha:]]+)*.*/\3\2\1/'

¿Cómo debería verse el comando y qué está mal?

Archivo de entrada:

rovshan:x:6532:113:Rovshan Ahmadli:/home/students/rovshan:/bin/bash
smith_63:x:6533:113:Smith Pataraprasitpon:/home/students/smith_63:/bin/bash
rashad:x:6534:113:Rashad Mahmudov:/home/students/rashad:/bin/bash
dilgamsh:x:6535:113:Dilgam Sharifov:/home/students/dilgamsh:/bin/bash
nlk_ns:x:6536:113:Nurlan Zhangali:/home/students/nlk_ns:/bin/bash
karpwiol:x:6537:113:WK:/home/students/karpwiol:/bin/bash
yigit123:x:6538:113:Mustafa Yigit Ersoz:/home/students/yigit123:/bin/bash
orxan123:x:6539:113:Orkhan Abiyev:/home/students/orxan123:/bin/bash
valiyev:x:6540:113:rufat valiyev:/home/students/valiyev:/bin/bash
muhaz:x:6541:113:AhmmedMuhaz Mohammed Kunhi Mulleria:/home/students/muhaz:/bin/bash
fatihebr:x:6542:113:Fatih Ocal:/home/students/fatihebr:/bin/bash
mrgo_g:x:6543:113:margarita gagaeva:/home/students/mrgo_g:/bin/bash
chrisd48:x:6544:113:Christian Hibestu:/home/students/chrisd48:/bin/bash
qwertinx:x:6545:113:Jakub Kaczmarczyk:/home/students/qwertinx:/bin/bash
grrronek:x:6546:113:Katarzyna Gro▒ska:/home/students/grrronek:/bin/bash
shahin:x:6547:113:Shahin Mehrabov:/home/students/shahin:/bin/bash
soufroud:x:6548:113:sofiane bouzroud:/home/students/soufroud:/bin/bash
jtrojak0:x:6549:113:Joanna Trojak:/home/students/jtrojak0:/bin/bash
jtrojak1:x:6550:113:Joanna Trojak:/home/students/jtrojak1:/bin/bash
markam:x:6551:113:Marcel Kami▒ski:/home/students/markam:/bin/bash

Lo que estoy tratando de lograr es, por ejemplo:

shahin:x:6547:113:Mehrabov Shahin:/home/students/shahin:/bin/bash
jtrojak1:x:6550:113:Trojak Joanna:/home/students/jtrojak1:/bin/bash
yigit123:x:6538:113:Ersoz Yigit Mustafa:/home/students/yigit123:/bin/bash

Respuesta1

Puedes probar esto con GNU sed, asumiendo que la cadena es única, si no, coméntala:

sed -E 's/:(\w+) (\w+) (\w+) (\w+):/:\4 \2 \3 \1:/' file

Producción:

muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash

Respuesta2

Para datos estructurados, es posible que una herramienta como Awk sea más adecuada, por ejemplo.

$ echo 'muhaz:x:6541:113:AhmmedMuhaz Mohammed Kunhi Mulleria:/home/students/muhaz:/bin/bash' | awk -F: '
    BEGIN {OFS=FS} 
    {n=split($5,a,/ /); $5 = a[n]; for(i=2;i<n;i++) $5 = $5 " " a[i]; $5 = $5 " " a[1]}
    {print}
  '
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash

Respuesta3

Usando GNU sed podemos hacerlo como:

$ sed -r '
    s/:/\n/4;s//\n/4
    s/\n(\S+)(.*\s)(\S+)\n/:\3\2\1:/
    y/\n/:/
' file

Marque el quinto campo mediante un marcador único que garantiza que no será encontrado.

Luego, dentro de esa parte bloqueada por los marcadores de ambos lados, voltea la primera y la última palabra.

En caso de que el paso anterior no se haya realizado, digamos que tenía solo un nombre, como lo serán las personas en Asia Central, por ejemplo, luego elimine esos marcadores.

sed por defecto imprime el espacio del patrón.

Respuesta4

Con GNU awk para gensub():

$ gawk 'BEGIN{FS=OFS=":"} {$5=gensub(/^(\S+)((\s+\S+)*\s+)(\S+)$/,"\\4\\2\\1",1,$5)} 1' file
rovshan:x:6532:113:Ahmadli Rovshan:/home/students/rovshan:/bin/bash
smith_63:x:6533:113:Pataraprasitpon Smith:/home/students/smith_63:/bin/bash
rashad:x:6534:113:Mahmudov Rashad:/home/students/rashad:/bin/bash
dilgamsh:x:6535:113:Sharifov Dilgam:/home/students/dilgamsh:/bin/bash
nlk_ns:x:6536:113:Zhangali Nurlan:/home/students/nlk_ns:/bin/bash
karpwiol:x:6537:113:WK:/home/students/karpwiol:/bin/bash
yigit123:x:6538:113:Ersoz Yigit Mustafa:/home/students/yigit123:/bin/bash
orxan123:x:6539:113:Abiyev Orkhan:/home/students/orxan123:/bin/bash
valiyev:x:6540:113:valiyev rufat:/home/students/valiyev:/bin/bash
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash
fatihebr:x:6542:113:Ocal Fatih:/home/students/fatihebr:/bin/bash
mrgo_g:x:6543:113:gagaeva margarita:/home/students/mrgo_g:/bin/bash
chrisd48:x:6544:113:Hibestu Christian:/home/students/chrisd48:/bin/bash
qwertinx:x:6545:113:Kaczmarczyk Jakub:/home/students/qwertinx:/bin/bash
grrronek:x:6546:113:Gro▒ska Katarzyna:/home/students/grrronek:/bin/bash
shahin:x:6547:113:Mehrabov Shahin:/home/students/shahin:/bin/bash
soufroud:x:6548:113:bouzroud sofiane:/home/students/soufroud:/bin/bash
jtrojak0:x:6549:113:Trojak Joanna:/home/students/jtrojak0:/bin/bash
jtrojak1:x:6550:113:Trojak Joanna:/home/students/jtrojak1:/bin/bash
markam:x:6551:113:Kami▒ski Marcel:/home/students/markam:/bin/bash

Con un sed que toma un -Eargumento para admitir ERE (por ejemplo, GNU u OSX/BSD sed):

$ sed -E 's/(([^:]*:){4})([^[:space:]:]+)(([[:space:]]+[^[:space:]:]+)*[[:space:]]+)([^[:space:]:]+)/\1\6\4\3/' file
rovshan:x:6532:113:Ahmadli Rovshan:/home/students/rovshan:/bin/bash
smith_63:x:6533:113:Pataraprasitpon Smith:/home/students/smith_63:/bin/bash
rashad:x:6534:113:Mahmudov Rashad:/home/students/rashad:/bin/bash
dilgamsh:x:6535:113:Sharifov Dilgam:/home/students/dilgamsh:/bin/bash
nlk_ns:x:6536:113:Zhangali Nurlan:/home/students/nlk_ns:/bin/bash
karpwiol:x:6537:113:WK:/home/students/karpwiol:/bin/bash
yigit123:x:6538:113:Ersoz Yigit Mustafa:/home/students/yigit123:/bin/bash
orxan123:x:6539:113:Abiyev Orkhan:/home/students/orxan123:/bin/bash
valiyev:x:6540:113:valiyev rufat:/home/students/valiyev:/bin/bash
muhaz:x:6541:113:Mulleria Mohammed Kunhi AhmmedMuhaz:/home/students/muhaz:/bin/bash
fatihebr:x:6542:113:Ocal Fatih:/home/students/fatihebr:/bin/bash
mrgo_g:x:6543:113:gagaeva margarita:/home/students/mrgo_g:/bin/bash
chrisd48:x:6544:113:Hibestu Christian:/home/students/chrisd48:/bin/bash
qwertinx:x:6545:113:Kaczmarczyk Jakub:/home/students/qwertinx:/bin/bash
grrronek:x:6546:113:Gro▒ska Katarzyna:/home/students/grrronek:/bin/bash
shahin:x:6547:113:Mehrabov Shahin:/home/students/shahin:/bin/bash
soufroud:x:6548:113:bouzroud sofiane:/home/students/soufroud:/bin/bash
jtrojak0:x:6549:113:Trojak Joanna:/home/students/jtrojak0:/bin/bash
jtrojak1:x:6550:113:Trojak Joanna:/home/students/jtrojak1:/bin/bash
markam:x:6551:113:Kami▒ski Marcel:/home/students/markam:/bin/bash

información relacionada