У меня есть данные в следующем формате в ФАЙЛ 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
@FalcoGer => Как мне добиться желаемого результата => Не могли бы вы предложить мне изменение, которое мне нужно внести, чтобы оно заработало?
Удалите Name:
и замените \nAge:
на | . возможно, вам придется использовать tr для временной замены \n
другим символом, так как sed обрабатывает только целые строки.
так что теперь вы хотите, чтобы вывод был выровнен с помощью |? И у вас есть переменные количества пробелов во входном файле?
Почему вы используете head
?
Пожалуйста => прекратите => ставить случайные => стрелки в ваших => комментариях => => => =>.
Следующий скрипт сделает то, что вы хотите
#!/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 это так. заголовок записывается в файл выше начала цикла.
Комментарии в коде. Сценарий:
# 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 как насчет того, чтобы прочитать настоящий код вместо того, чтобы копировать его, а затем задаться вопросом, почему он не работает. в нем четко указано, что это три возможных решения, поэтому вывод будет напечатан трижды.
ну, используя
head
, вы ограничиваете свой вывод двумя строками, хотя я не узнаю вариант-2
. afaik, чтобы выбрать 2 строки, которые вы используете-n 2
. лично я бы использовалsed