Записать данные в файл в Formta Form

У меня есть данные в следующем формате в ФАЙЛ 1

NAME :  Ram 
AGE :  12
NAME :  Rahul
AGE:  13
NAME:   Raj
AGE:   14

Мой желаемый результат => В этом формате ниже мне нужно

Я хочу записать данные в ФАЙЛ 2 в следующем формате, например

NAME| AGE
Ram|12
Rahul|13
Raj|14

Мой код:

head -2 file1.txt | nl | tr '\n' '|' >> file2.txt

Но мой приведенный выше код печатается только в первых двух строках в File2.txt

1 NAME : Ram | 2 AGE : 12|

он должен зациклиться до конца и записать в файл 2

ну, используя head, вы ограничиваете свой вывод двумя строками, хотя я не узнаю вариант -2. afaik, чтобы выбрать 2 строки, которые вы используете -n 2. лично я бы использовал sed

FalcoGer 31.05.2019 09:23

@FalcoGer => Как мне добиться желаемого результата => Не могли бы вы предложить мне изменение, которое мне нужно внести, чтобы оно заработало?

volmokirti 31.05.2019 09:24

Удалите Name: и замените \nAge: на | . возможно, вам придется использовать tr для временной замены \n другим символом, так как sed обрабатывает только целые строки.

FalcoGer 31.05.2019 09:32

так что теперь вы хотите, чтобы вывод был выровнен с помощью |? И у вас есть переменные количества пробелов во входном файле?

FalcoGer 31.05.2019 09:37

Почему вы используете head?

melpomene 31.05.2019 09:39

Пожалуйста => прекратите => ставить случайные => стрелки в ваших => комментариях => => => =>.

melpomene 31.05.2019 10:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Следующий скрипт сделает то, что вы хотите

#!/bin/bash
input = "./file1.txt"
evenLine=0

# this will overwrite file2.txt
echo "Name|Age" > file2.txt

# loop over all lines
while IFS= read -r line
do
  if [ 0 -eq $evenLine ]
  then
    # -n to not append newline, remove string "Name: "
    echo -n "$line" | sed -e "s/Name: *//g" >> file2.txt
    evenLine=1
  else
    # replace "Age: " with " | "
    echo "$line" | sed -e "s/Age: */ | /g" >> file2.txt
    evenLine=0
  fi
done < "$input"

@FalcoGer ... Вы посмотрите на желаемый вывод ... ваш код не печатает то, что ожидается ... заголовок должен быть напечатан только один раз

volmokirti 31.05.2019 10:32

@volmokirti это так. заголовок записывается в файл выше начала цикла.

FalcoGer 31.05.2019 10:38
Ответ принят как подходящий

Комментарии в коде. Сценарий:

# input test file as provided by OP
cat <<EOF >file
NAME :  Ram 
AGE :  12
NAME :  Rahul
AGE:  13
NAME:   Raj
AGE:   14
EOF

# My first solution - a simple bash while read loop
echo "NAME|AGE"
while IFS=': ' read -r _ name && IFS=': ' read -r _ age; do
    echo "$name|$age"
done <file

# Second solution - some parsing + xargs
# first remove spaces, then substitue `:` for a space
# then run printf, don't print any NAME and AGE %.0s and print the names and ages %s
echo "NAME|AGE"
<file tr -d ' ' | tr ':' ' ' | xargs printf "%.0s%s|%.0s%s\n"

# Third solution - sed!
# first remove spaces and remove everything before :
# then read two lines, substitue newline for a | and print
echo "NAME|AGE"
<file sed 's/ //g; s/.*://' | sed 'N;s/\n/|/'

выведет:

NAME|AGE
Ram|12
Rahul|13
Raj|14
NAME|AGE
Ram|12
Rahul|13
Raj|14
NAME|AGE
Ram|12
Rahul|13
Raj|14

Проверено на обучающая точка

Не могли бы вы взять ИМЯ и ВОЗРАСТ только один раз в качестве заголовка в верхней первой строке?

volmokirti 31.05.2019 11:31

@volmokirti как насчет того, чтобы прочитать настоящий код вместо того, чтобы копировать его, а затем задаться вопросом, почему он не работает. в нем четко указано, что это три возможных решения, поэтому вывод будет напечатан трижды.

FalcoGer 31.05.2019 11:49

Другие вопросы по теме