一个Shell问题,我实在想不出来,请大家帮帮忙!

woaitengyu01 2013-04-09 09:57:40
大家好,我是刚学linux的新手,我用是red hat,现在遇到一个问题,解决不了,请大家帮忙看看,小弟没齿难忘。

这个是一个txt文件,文件名:test.txt,其内容如下
Start of Data
**********************************************************************
Record (1) "EGSNPDPRecord"
"recordType" = "00E1"
"servedIMSI" = "455001131950438"
"ggsniPBinV4Address" = "116193008089"
"chargingID" = "72DF9D5B"
End of Record (1)
Record (2) "EGSNPDPRecord"
"recordType" = "00E1"
"servedIMSI" = "455001151010916"
"ggsniPBinV4Address" = "116193008089"
"chargingID" = "5B9DB29F"
End of Record (2)
**********************************************************************
End of Data

问题:使用Shell或者其他办法,将上述的文件转换成如下格式,写到一个文件,文件名另定
Result File:
00E1|455001131950438|116193008089|72DF9D5B
00E1|455001151010916|116193008089|5B9DB29F

----请各位赐教!!!小弟非常感谢你们。我已经试了一天还是没弄成答案那样。。
...全文
107 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
linux-c 2013-04-10
  • 打赏
  • 举报
回复
#!/usr/bin/perl -w
open (FILE,"<logfile");
$/ = "\"" ;
while(<FILE>)
    {
        if($_=~/End/)
            {
                print "\n" ;
            }
        if($_=~/(^[0-9])\w/)
            {
                $_=~s/\"//g;
                print "$_|" ;
            }
    }
close(FILE);
00E1|455001131950438|116193008089|72DF9D5B| 00E1|455001151010916|116193008089|5B9DB29F|
justkk 2013-04-10
  • 打赏
  • 举报
回复
试试这样
sed -n '/=/ s/.*"\(.*\)"/\1/p' test.txt|paste -d \| - - - -
justkk 2013-04-10
  • 打赏
  • 举报
回复
sed -n '/=/p' test.txt|sed 's/.*=//'|sed 's/[" ]//g'|paste -d \| - - - -
justkk 2013-04-10
  • 打赏
  • 举报
回复
sed -n '/=/p' f4|sed 's/.*=//'|sed 's/[" ]//g'|paste -d \| - - - -
linux-c 2013-04-10
  • 打赏
  • 举报
回复
awk -F'"' ' /^"/ {printf("%s|",$4)} /^End/ {print "\n"}' logfile 00E1|455001131950438|116193008089|72DF9D5B| 00E1|455001151010916|116193008089|5B9DB29F|
mayer 2013-04-10
  • 打赏
  • 举报
回复
引用 3 楼 linwhwylb 的回复:
Python code?1234$ awk 'BEGIN{FS="\""}/= /{v[i++]=$4}END{print "Result File:";for(i=0;i<length(v);i++){if((i+1)%4)printf "%s|", v[i];else printf "%s\n", v[i]}}' test.txt Result File:00E1|4……
厉害,用awk是可以搞定的
Linux-Torvalds 2013-04-10
  • 打赏
  • 举报
回复
$ awk 'BEGIN{FS="\""}/= /{v[i++]=$4}END{print "Result File:";for(i=0;i<length(v);i++){if((i+1)%4)printf "%s|", v[i];else printf "%s\n", v[i]}}' test.txt 
Result File:
00E1|455001131950438|116193008089|72DF9D5B
00E1|455001151010916|116193008089|5B9DB29F
woaitengyu01 2013-04-10
  • 打赏
  • 举报
回复
引用 9 楼 Mr_Ringht 的回复:
Perl code?12345678910111213141516#!/usr/bin/perl -wopen (FILE,"<logfile");$/ = "\"" ;while(<FILE>) { if($_=~/End/) { print "\n" ; } i……
Perl还是没这么看懂,我没那么基础,应该是正确,谢谢你的帮助!!
woaitengyu01 2013-04-10
  • 打赏
  • 举报
回复
引用 2 楼 CaspianSea 的回复:
Plain Text code?1234567891011121314151617181920212223242526echo $1echo $2rm $2#read line < $1#while [ -n "$line" ]while read linedo#echo "$line"temp=$(echo "$line" | cut -d"=" -s -f2)#ech……
谢谢你的帮助哈,已经解决了,你是第一个回答我的问题,而且是对的,分就给你了!
woaitengyu01 2013-04-10
  • 打赏
  • 举报
回复
引用 3 楼 linwhwylb 的回复:
Python code?1234$ awk 'BEGIN{FS="\""}/= /{v[i++]=$4}END{print "Result File:";for(i=0;i<length(v);i++){if((i+1)%4)printf "%s|", v[i];else printf "%s\n", v[i]}}' test.txt Result File:00E1|4……
很强大,我得好好学习一下。谢谢你的帮助。
CaspianSea 2013-04-10
  • 打赏
  • 举报
回复
echo $1
echo $2
rm $2
#read line < $1
#while [ -n "$line" ]
while read line
do
#echo "$line"
temp=$(echo "$line" | cut -d"=" -s -f2)
#echo "temp = $temp"
echo "$line" | grep "="
if [ $? -eq 0 ]; then
	if [ -z "$result" ]; then
		result=$temp;
	else
		echo "$temp is null" 
		result=$result"|"$temp
	fi
	echo "result = $result"
elif [ -n "$result" ]; then
	echo "write $result to file $2"
	echo $result | sed 's/[\" ]//g' >>$2
	unset result
fi
#read line < $1
done < $1
这样使用: ./script.sh data.txt outputfile.txt
woaitengyu01 2013-04-09
  • 打赏
  • 举报
回复
顶起来,不能沉下去啊,求各位大神帮忙!!!....

18,771

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧