我有一个大文本文件,内容如下所示,
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
's 段落模式进行处理:
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
),其中键是字段名称(位于符号左侧),值是每行的=
字段值(位于符号右侧)。=
一旦段落被解析成这个结构,我们就会打印出“name”和“age”字段的值。
答案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
打印上一个命令输出的第二个和第四个参数
您仍然面临着理解谷歌可能深入解释的任何语法的任何问题:)。
答案4
既然你要求另一种语言。这是一name
在 Python 中执行此操作的方法是将输入保存在字典中,以便您可以使用键和轻松访问值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="")
鉴于此 infile ( 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