用逗号和等号分隔的Shell脚本解析文本文件

Posted

技术标签:

【中文标题】用逗号和等号分隔的Shell脚本解析文本文件【英文标题】:Parsing a text file in Shell Script separated by comma and equalsTo sign 【发布时间】:2014-08-26 06:06:45 【问题描述】:

我想编写一个 shell 脚本来解析输入文本文件的每一行,并以键值的格式输出。

示例输入行 ->

NAME=Bhavin,RollNo=123,Class=10,Rank=1 ( Line 1 )
EMPLOYEE=Prashant,EID=233,Role=Consultant ( Line 2 )
COMPANY=xyz,location=india ( Line 3 )

预期的输出是:

Name = Bhavin
RollNo = 123
Class = 10
Rank = 1
**********
EMPLOYEE=Prashant
EID=233
Role=Consultant
**********
COMPANY=xyz
location=india
**********

谢谢, 巴文

【问题讨论】:

这在一定程度上对我有用 - 而 IFS=, 阅读 -ra arr;回声 $arr[0];回声 $arr[1];完成 但是,我如何知道每行中键值对的数量?它可以变化 【参考方案1】:

使用 awk 你可以做到:

awk -F '[ ,]+' 'for (i=1; i<=NF; i++) if (index($i, "=")) 
       split($i, a, "="); print a[1], "=", a[2] print "**********"' file
NAME = Bhavin
RollNo = 123
Class = 10
Rank = 1
**********
EMPLOYEE = Prashant
EID = 233
Role = Consultant
**********
COMPANY = xyz
location = india
**********

【讨论】:

【参考方案2】:

这是一个sed 解决方案。如果输入文件名为input,则运行:

$ sed 's/=/ = /g; s/,/\n/g; s/$/\n**********/' input
NAME = Bhavin
RollNo = 123
Class = 10
Rank = 1
**********
EMPLOYEE = Prashant
EID = 233
Role = Consultant
**********
COMPANY = xyz
location = india
**********

工作原理

sed 是一名编辑。这里使用的基本命令是形式为s/old/new/ 的替代命令。我们使用三个替代命令:

s/=/ = /g

这会在所有等号周围放置空格。命令末尾的g 告诉sed 对行上的每个等号执行此替换,而不仅仅是第一个。

s/,/\n/g

这会在出现逗号的任何地方用换行符替换逗号。

s/$/\n**********/

在每行输入之后,添加一行星号。

【讨论】:

【参考方案3】:

感谢您的回复,这对我也有用:-

HOME_DIR="/home/bhatiab/ashok/src/ExcessInterfaces";
MAINENTITY_FILENAME="MainEntities.log";

while read line
do
    ENTITY_NAME=`echo $line | cut -d "," -f1`
    echo "ENTITY_NAME = "$ENTITY_NAME""
    arr=$(echo $line | tr "," "\n")
    for x in $arr
    do
        echo "$x"
    done
    echo "********************";

done < $HOME_DIR/$MAINENTITY_FILENAME

【讨论】:

以上是关于用逗号和等号分隔的Shell脚本解析文本文件的主要内容,如果未能解决你的问题,请参考以下文章

在shell脚本中获取逗号分隔值

VBS操作文本文件的问题

字符串 CSV解析 表格 逗号分隔值

如何用Java解析CSV文件

正则表达式用逗号和等号解析字符串

shell 脚本里面从一个文本里面读出一个数字,如何转换成整数?我需要用这个数字进行加减乘除