Скопируйте числа в начале каждой строки в конец строки - PullRequest
0 голосов
/ 10 октября 2018

У меня есть файл, который производит такие строки.Я хочу отредактировать эти строки и поместить их в passageiros.txt

a82411:x:1015:1006:Adriana Morais,,,:/home/a82411:/bin/bash
a60395:x:1016:1006:Afonso Pichel,,,:/home/a60395:/bin/bash
a82420:x:1017:1006:Afonso Alves,,,:/home/a82420:/bin/bash
a69225:x:1018:1006:Afonso Alves,,,:/home/a69225:/bin/bash
a82824:x:1019:1006:Afonso Carreira,,,:/home/a82824:/bin/bash
a83112:x:1020:1006:Aladje Sanha,,,:/home/a83112:/bin/bash
a82652:x:1022:1006:Alexandre Ferreira,,,:/home/a82652:/bin/bash
a83063:x:1023:1006:Alexandre Feijo,,,:/home/a83063:/bin/bash
a82540:x:1024:1006:Ana Santana,,,:/home/a82540:/bin/bash

С помощью следующего кода я могу получить что-то вроде этого:

cat /etc/passwd |grep "^a[0-9]" | cut -d ":" -f1,5 | sed "s/a//" | sed "s/,//g" > passageiros.txt
sed -e "s/$/:::a/" -i passageiros.txt


82411:Adriana Morais:::a
60395:Afonso Pichel:::a
82420:Afonso Alves:::a
69225:Afonso Alves:::a
82824:Afonso Carreira:::a
83112:Aladje Sanha:::a
82652:Alexandre Ferreira:::a
83063:Alexandre Feijo:::a
82540:Ana Santana:::a

Поэтому моя цель - создатькак то так:

82411:Adriana Morais:::a82411@
60395:Afonso Pichel:::a60395@
82420:Afonso Alves:::a82420@
69225:Afonso Alves:::a69225@
82824:Afonso Carreira:::a82824@
83112:Aladje Sanha:::a83112@
82652:Alexandre Ferreira:::a82652@
83063:Alexandre Feijo:::a83063@
82540:Ana Santana:::a82540@

Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Не могли бы вы попробовать следующее.

awk -F'[:,]' '{val=$1;sub(/[a-z]+/,"",$1);print $1,$5,_,_,val"@"}' OFS=":" Input_file

Объяснение: Добавление пояснения к вышеуказанному коду.

awk -F'[:,]' '               ##Starting awk script here and making field seprator as colon and comma here.
{                            ##Starting main block here for awk.
  val=$1                     ##Creating a variable val whose value is first field.
  sub(/[a-z]+/,"",$1)        ##Using sub for substituting any kinf of alphabets small a to z in first field with NULL here.
  print $1,$5,_,_,val"@"     ##Printing 1st, 5th field and printing 2 NULL variables and printing variable val with @.
}                            ##Closing block for awk here.
' OFS=":" Input_file         ##Mentioning OFS value as colon here and mentioning Input_file name here.

РЕДАКТИРОВАТЬ: Добавление решения @ Aserre тоже здесь.

awk -F'[:,]' '{print substr($1, 2),$5,_,_,$1"@"}' OFS=":"  Input_file
0 голосов
/ 10 октября 2018

Вы можете использовать только один сед:

grep  '^a' file | cut -d: -f1,5 | sed 's/a\([^:]*\)\(.*\)/\1\2:::a\1@/;s/,,,//' 
0 голосов
/ 10 октября 2018

Вы можете использовать следующее awk:

awk 'BEGIN {FS=OFS=":"} {sub(/^a/, "", $1); gsub(/,/, "", $5); print $1, $5, _, _, "a" $1 "@"}' file > passageiros.txt

См. онлайн-демонстрацию

Подробности

  • BEGIN {FS=OFS=":"} устанавливает разделитель поля ввода и вывода на :
  • sub(/^a/, "", $1) удаляет первый a из поля 1
  • gsub(/,/, "", $5) удаляет все , изПоле 5
  • print $1, $5, _, _, "a" $1 "@" выводит на печать только необходимые поля.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...