У меня есть большой текстовый файл с показаниями, как показано ниже,
name=ABC
class=3
age=7
roll_no=41
name=XYZ
class=4
age=9
roll_no=23
Итак, как мне разделить каждое name
из них age
и записать результат в одну строку, значения разделяются пробелом, вот так:
ABC 3
XYZ 9
Есть ли какой-либо инструмент/скрипт для сохранения результата в JSON
формате ?
Пробовал часами работать с awk
, sed
, и т.д. и т.п., но я ужасен в обработке текста в командной строке, заранее спасибо tr
.grep
решение1
Я бы использовал awk:
awk -F"=" '
{data[$1] = $2}
function output() {
if ("name" in data && "age" in data)
print data["name"], data["age"]
delete data
}
NF == 0 {output()}
END {output()}
' filename
решение2
Если perl
доступно, фрагменты текста, разделенные одной или несколькими пустыми строками, идеально подходят для обработки в perl
режиме абзаца:
perl -n00e ' # Read the input file paragraph-by-paragraph
# Split each paragraph into lines and join the lines with an = sign:
$s = join "=",split /\n/;
# Split the joined fields on = signs (with possible blanks around them):
%h = split /\s*=\s*/,$s;
print "$h{name} $h{age}\n" # Print the required information
' your_file
В приведенном выше коде ваш файл анализируется в хэш-структуру ( %h
), где ключи — это имена полей (слева от знаков =
), а значения — это значения полей (справа от знаков =
) в каждой строке. После того, как абзац был проанализирован в эту структуру, мы выводим значения полей «имя» и «возраст».
решение3
Вы можете использовать следующую команду:
grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'
это даст вывод вроде:
ABC 7
XYZ 9
РЕДАКТИРОВАТЬ:
Ниже команда выдаст строку, содержащую строку name
илиage
grep -E "name|age" filename
name=ABC
age=7
name=XYZ
age=9
Эта команда создаст одну строку из двух строк.
grep -E "name|age" filename | sed 'N;s/\n/ /'
name=ABC age=7
name=XYZ age=9
Приведенная ниже команда удалит знак равенства = из вывода.
grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'
name ABC age 7
name XYZ age 9
Ниже команда, печатающая ваши требования
grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'
ABC 7
XYZ 9
awk
печать 2-го и 4-го аргументов вывода предыдущей команды
все же вы сталкиваетесь с какими-либо проблемами в понимании любого синтаксиса, Google может объяснить это подробно :).
решение4
Так как вы просили другой язык. Вотодинспособ сделать это в Python, сохранив входные данные в словаре, чтобы можно было легко получить доступ к значениям с помощью ключей name
и age
:
#!/usr/bin/env python3
myDict = {}
with open("ages") as inFile:
for line in inFile:
if line == "\n":
print(myDict['name'].rstrip() + " " + myDict['age'], end="")
continue
(key, value) = line.split("=")
myDict[key] = value
print(myDict['name'].rstrip() + " " + myDict['age'], end="")
Учитывая этот входной файл ( ages
):
name=ABC
class=3
age=7
roll_no=41
name=XYZ
class=4
age=9
roll_no=23
Я получаю такой результат:
./pyAges.py
ABC 7
XYZ 9