用脚本提取文本中的数据
-
- 帖子: 213
- 注册时间: 2009-07-13 16:23
Re: 用脚本提取文本中的数据
我的数据文件如附件。ZINC一行可以代表一个名字,数字的第1行是一个结果,用程序提取数据,必须使名字和数字一一对应。在运行过程中名字可能产生多次的重复,这些重复可能导致对应关系的失败。我发现uniq只能删除1次重复,如果重复有多次,是不是多写几个uniq在前面。另外,生成的文件中总是多一个空行,不知道为什么。
附件中log是生成后的文件,results.txt是原始文件,result_cluster是执行文件。
附件中log是生成后的文件,results.txt是原始文件,result_cluster是执行文件。
- 附件
-
- test.rar
- (22.54 KiB) 已下载 47 次
- xzap
- 帖子: 256
- 注册时间: 2006-08-24 21:25
Re: 用脚本提取文本中的数据
这个问题你不把这个文件发上来的话想破脑袋我也想不出来阿。
首先说明一点,uniq不是删除连续的两行,而是删除所有的连续行,至于为什么你的文件中有
ZINC00011133
ZINC00011133
ZINC00011133
这样的情况却只删除两个呢?
其实很简单,你这个文件估计是win系统下的。所以有win的回车换行符。
其实情况是这样的
ZINC00011133
ZINC00011133
ZINC00011133^M
有的编辑器是不显示出来这个^M 的。所以你没发现吧。用vim打开就可以看到了。所以这里确实只有2行重复,第三个不一样。
所以要解决也很简单。删掉^M就可以了
而且你的这个文件中uniq是绝对不能放后面的。因为有很多的ZINCxxxxx是一样的。
这样就可以完美解决你附件中的文件了。
但是可惜的是不能保存为脚本,因为这里的^M不是^和M,是win的回车换行符
输入方法是在命令行下 按住CTRL+v,松开v,按m 就会出现^M
也可以用下面这个脚本。可以保存在脚本文件里使用
还有其实你这个文件里有很多的ZINCxxxxxxx都是一样的,如果你一样的都只要一个就这样。
够清楚了吧,具体情况具体对待,上面的脚本绝对可以搞定你附件中的那个txt。但是不保证通用性
首先说明一点,uniq不是删除连续的两行,而是删除所有的连续行,至于为什么你的文件中有
ZINC00011133
ZINC00011133
ZINC00011133
这样的情况却只删除两个呢?
其实很简单,你这个文件估计是win系统下的。所以有win的回车换行符。
其实情况是这样的
ZINC00011133
ZINC00011133
ZINC00011133^M
有的编辑器是不显示出来这个^M 的。所以你没发现吧。用vim打开就可以看到了。所以这里确实只有2行重复,第三个不一样。
所以要解决也很简单。删掉^M就可以了
而且你的这个文件中uniq是绝对不能放后面的。因为有很多的ZINCxxxxx是一样的。
代码: 全选
cat results.txt |sed 's/^M//g'|uniq|sed -ne '/ZINC.*/p' -e '/ 1 /p'|awk 'NF==1{print $1 "\t"}NF==4{print $2}' |sed 'N;/ZINC.*/s/\n/\t/g' > log
但是可惜的是不能保存为脚本,因为这里的^M不是^和M,是win的回车换行符
输入方法是在命令行下 按住CTRL+v,松开v,按m 就会出现^M
也可以用下面这个脚本。可以保存在脚本文件里使用
代码: 全选
cat results.txt|tr -d '\r'|uniq|sed -ne '/ZINC.*/p' -e '/ 1 /p'|awk 'NF==1{print $1 "\t"}NF==4{print $2}' |sed 'N;/ZINC.*/s/\n/\t/g' > log
代码: 全选
cat results.txt|tr -d '\r'|uniq|sed -ne '/ZINC.*/p' -e '/ 1 /p'|awk 'NF==1{print $1 "\t"}NF==4{print $2}' |sed 'N;/ZINC.*/s/\n/\t/g'|uniq -w 12 > log
够清楚了吧,具体情况具体对待,上面的脚本绝对可以搞定你附件中的那个txt。但是不保证通用性
- O_O_BOT
- 帖子: 2461
- 注册时间: 2009-05-20 19:32
Re: 用脚本提取文本中的数据
准确来说 应该是 不带参数的uniq默认 是合并相连的重复行。(还有一行剩下 而不是都删除了 楼上表达有问题),uniq不是删除连续的两行,而是删除所有的连续行
文件可以用 | dos2unix 先转一下 就可以了
irc 聊天室
ubuntu-cn 的irc 频道为
irc.ubuntu.com 8001 #ubuntu-cn
UTF8编码 可用 irssi xchat pidgin weechat 登录
http://webchat.freenode.net/?channels=ubuntu-cn
[url]irc://irc.freenode.net/ubuntu-cn[/url]
ubuntu-cn 的irc 频道为
irc.ubuntu.com 8001 #ubuntu-cn
UTF8编码 可用 irssi xchat pidgin weechat 登录
http://webchat.freenode.net/?channels=ubuntu-cn
[url]irc://irc.freenode.net/ubuntu-cn[/url]
-
- 帖子: 213
- 注册时间: 2009-07-13 16:23
Re: 用脚本提取文本中的数据
xzap 分析的问题很准确,我的确在win下操作了我的文件,才出现了问题。又学了不少,多谢xzap, O_O_BOT 

- xzap
- 帖子: 256
- 注册时间: 2006-08-24 21:25
Re: 用脚本提取文本中的数据
确实是我的表达不够准确。谢谢提醒。下次注意O_O_BOT 写了: 准确来说 应该是 不带参数的uniq默认 是合并相连的重复行。(还有一行剩下 而不是都删除了 楼上表达有问题)
文件可以用 | dos2unix 先转一下 就可以了
如果楼主有在win下操作的需要。建议使用ultraedit。
-
- 帖子: 213
- 注册时间: 2009-07-13 16:23
Re: 用脚本提取文本中的数据
ultraedit,又学了一招。下载之
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
-
- 帖子: 213
- 注册时间: 2009-07-13 16:23
Re: 用脚本提取文本中的数据
在我的数据中可能存在以下格式(标注蓝色的为可能的异常情况):
ZINC000004912
ZINC00000815
Detected 4 CPUs
Reading input ... done.
Setting up the scoring function ... done.
Analyzing the binding site ... done.
Using random seed: 1651066026
Performing search ... done.
Refining results ... done.
mode | affinity | dist from best mode
| (kcal/mol) | rmsd l.b.| rmsd u.b.
-----+------------+----------+----------
1 -4.9 0.000 0.000
2 -4.9 1.539 3.409
3 -4.7 1.604 2.262
4 -4.7 4.307 6.589
5 -4.7 3.605 7.888
6 -4.6 4.302 6.830
7 -4.6 3.857 6.132
Writing output ... done.
=======================
ZINC000010923
Detected 4 CPUs
Reading input ...=============
ZINC00001090
Detected 4 CPUs
Reading input ... done.
Setting up the scoring function ... done.
Analyzing the binding site ... done.
Using random seed: 36769704
Performing search ... done.
Refining results ... done.
mode | affinity | dist from best mode
| (kcal/mol) | rmsd l.b.| rmsd u.b.
-----+------------+----------+----------
1 -4.7 0.000 0.000
2 -4.7 1.312 2.831
3 -4.3 4.337 8.042
4 -4.3 3.651 7.000
5 -4.2 2.042 3.683
6 -4.2 3.356 5.476
7 -4.0 2.521 6.504
Writing output ... done.
=======================
在这些情况下就会造成错行,根据您的建议在脚本中修改了一下(加入了蓝色区域),结果还是错位了:
cat results.txt|tr -d '\r'|uniq|sed -ne '/ZINC.*/p' -e '/ 1 /p'|awk 'NF==1{print $1 "\t"}NF==4{print $2}' |sed 'N;/ZINC.*/s/\n/\t/g' | sed 's/ZINC$//g' > log
结果:
文本格式都已用dos2unix转换。请指导一下,正在努力学习linux,这个代码比较急用。谢谢!
ZINC000004912
ZINC00000815
Detected 4 CPUs
Reading input ... done.
Setting up the scoring function ... done.
Analyzing the binding site ... done.
Using random seed: 1651066026
Performing search ... done.
Refining results ... done.
mode | affinity | dist from best mode
| (kcal/mol) | rmsd l.b.| rmsd u.b.
-----+------------+----------+----------
1 -4.9 0.000 0.000
2 -4.9 1.539 3.409
3 -4.7 1.604 2.262
4 -4.7 4.307 6.589
5 -4.7 3.605 7.888
6 -4.6 4.302 6.830
7 -4.6 3.857 6.132
Writing output ... done.
=======================
ZINC000010923
Detected 4 CPUs
Reading input ...=============
ZINC00001090
Detected 4 CPUs
Reading input ... done.
Setting up the scoring function ... done.
Analyzing the binding site ... done.
Using random seed: 36769704
Performing search ... done.
Refining results ... done.
mode | affinity | dist from best mode
| (kcal/mol) | rmsd l.b.| rmsd u.b.
-----+------------+----------+----------
1 -4.7 0.000 0.000
2 -4.7 1.312 2.831
3 -4.3 4.337 8.042
4 -4.3 3.651 7.000
5 -4.2 2.042 3.683
6 -4.2 3.356 5.476
7 -4.0 2.521 6.504
Writing output ... done.
=======================
在这些情况下就会造成错行,根据您的建议在脚本中修改了一下(加入了蓝色区域),结果还是错位了:
cat results.txt|tr -d '\r'|uniq|sed -ne '/ZINC.*/p' -e '/ 1 /p'|awk 'NF==1{print $1 "\t"}NF==4{print $2}' |sed 'N;/ZINC.*/s/\n/\t/g' | sed 's/ZINC$//g' > log
结果:
代码: 全选
ZINC000004912 ZINC00000815
-4.9 ZINC000010923
ZINC00001090 -4.7
-
- 帖子: 1028
- 注册时间: 2008-11-01 21:42
- 来自: 树下板凳
Re: 用脚本提取文本中的数据
代码: 全选
cat results.txt|tr -d '\r'|sed -ne '/ZINC.*/p' -e '/1 *-/p'|awk 'NF==1{print $1 "\t"}NF==4{print $2}' |sed -e :a -e '$!N;s/\n\(-\.*\)/\1/;ta' -e 'P;D'|sed -ne '/ZINC.*\..*/p' >log
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。
-
- 帖子: 213
- 注册时间: 2009-07-13 16:23
Re: 用脚本提取文本中的数据
问题解决。非常感谢。回头再研究代码。 
