есть ли способ добавить символы между разделителями в текстовом файле? - PullRequest
1 голос
/ 05 мая 2020

У меня есть входной файл (customers.txt), который выглядит так:

Name, Age, Email, 
Hank, 22, hank@mail.com
Nathan, 32, nathan@mail.com
Gloria, 24, gloria@mail.com

Я пытаюсь вывести в файл (customersnew.txt), чтобы он выглядел так:

Name: Hank     Age: 22   Email: hank@mail.com
Name: Nathan   Age: 32   Email: nathan@mail.com
Name: Gloria   Age: 24   Email: gloria@mail.com

До сих пор мне удавалось получить только такой вывод:

Name: Hank, 22, hank@mail.com
Name: Nathan, 32, nathan@mail.com
Name: Gloria, 24, gloria@mail.com

Код, который я использую:

sed -e '1d'\
    -e 's/.*/Name: &/g' customers.txt > customersnew.txt

Я также пробовал разделить данные, используя -e 's/,/\n/g'\, а затем -e '2s/.*Age: &/g'. Не работает. Любая помощь будет высоко ценится.

Ответы [ 3 ]

3 голосов
/ 05 мая 2020

Думали ли вы об использовании для этого awk? Например:

$ awk 'BEGIN {FS=", ";OFS="\t"} NR==1 {split($0,hdr);next} {for(i=1;i<=NF;i++)$i=hdr[i]": "$i} 1' file
Name: Hank      Age: 22 Email: hank@mail.com
Name: Nathan    Age: 32 Email: nathan@mail.com
Name: Gloria    Age: 24 Email: gloria@mail.com

Это просто сохраняет заголовки в массив и добавляет каждое поле в следующих записях с помощью <header>:.

2 голосов
/ 05 мая 2020

Это может сработать для вас (GNU sed & столбец):

sed -E '1h;1d;G;s/^/,/;:a;s/,\s*(.*\n)([^,]+),/\2: \1/;ta;P;d' file | column -t

Скопируйте заголовок в место хранения.

Добавьте заголовок к каждой строке сведений.

Добавьте запятую к началу строки.

Создайте замену l oop, которая заменяет первую запятую первым заголовком в добавленном заголовке.

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

Для отображения в аккуратных столбцах используйте команду столбца с параметром -t.

2 голосов
/ 05 мая 2020

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

awk '
BEGIN{
  FS=", "
  OFS="\t"
}
FNR==1{
  for(i=1;i<=NF;i++){
    value[i]=$i
  }
  next
}
{
  for(i=1;i<=NF;i++){
    $i=value[i] ": " $i
  }
}
1
'  Input_file

Объяснение: Добавление объяснения для решения выше.

awk '                         ##Starting awk program from here.
BEGIN{                        ##Starting BEGIN section of this program from here.
  FS=", "                     ##Setting field separator as comma space here.
  OFS="\t"                    ##Setting output field separator as TAB here for all lines.
}
FNR==1{                       ##Checking here if this is first line then do following.
  for(i=1;i<=NF;i++){         ##Starting a for loop to traverse through all elements of fields here.
    value[i]=$i               ##Creating an array named value with index variable i and value is current field value.
  }
  next                        ##next will skip all further statements from here.
}
{
  for(i=1;i<=NF;i++){         ##Traversing through all fields of current line here.
    $i=value[i] ": " $i       ##Setting current field value adding array value with index i colon space then current fiedl value here.
  }
}
1                             ##1 will print all lines here.
'  Input_file                 ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...