linux – Bash:如何保持文件中的行具有与另一个文件中的行匹配的字段?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – Bash:如何保持文件中的行具有与另一个文件中的行匹配的字段?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1531字,纯文字阅读大概需要3分钟。
内容图文
![linux – Bash:如何保持文件中的行具有与另一个文件中的行匹配的字段?](/upload/InfoBanner/zyjiaocheng/954/41b44f9af4bb471ea44a86cbae1255e1.jpg)
我有两个包含大量文本的大文件,我要做的是将文件A中的所有行保留在一个字段中,该字段与文件B中的字段匹配.
文件A是这样的:
Name (tab) # (tab) # (tab) KEYFIELD (tab) Other fields
文件B我设法使用cut和sed等基本上将它归结为一个列表的字段.
因此,如果该行的字段与文件B中的一行匹配,则目标是将文件A中的所有行保留在第4个字段(它表示为KEYFIELD).(不必是完全匹配,因此如果文件B具有Blah和文件A说Blah_blah,没关系
我试着这样做:
grep -f fileBcutdown fileA > outputfile
编辑:好的,我放弃了.我只是强迫它杀了它.
有一个更好的方法吗?对于任何关心的人来说,文件A是13.7MB,减少后的文件B是32.6MB.
编辑:这是文件A中的示例行:
chr21 33025905 33031813 ENST00000449339.1 0 - 33031813 33031813 0 3 1835,294,104, 0,4341,5804,
文件B中的示例行减少:
ENST00000111111
解决方法:
这是使用GNU awk的一种方式.运行如下:
awk -f script.awk fileB.txt fileA.txt
script.awk的内容:
FNR==NR {
array[$0]++
next
}
{
line = $4
sub(/\.[0-9]+$/, "", line)
if (line in array) {
print
}
}
或者,这是单行:
awk 'FNR==NR { array[$0]++; next } { line = $4; sub(/\.[0-9]+$/, "", line); if (line in array) print }' fileB.txt fileA.txt
GNU awk还可以执行使用cut和sed描述的fileB.txt的预处理.如果您希望我将其构建到上面的脚本中,您需要提供此行的示例.
使用文件HumanGenCodeV12和GenBasicV12进行更新:
运行如下:
awk -f script.awk HumanGenCodeV12 GenBasicV12 > output.txt
script.awk的内容:
FNR==NR {
gsub(/[^[:alnum:]]/,"",$12)
array[$12]++
next
}
{
line = $4
sub(/\.[0-9]+$/, "", line)
if (line in array) {
print
}
}
这成功地在GenBasicV12中打印了可以在HumanGenCodeV12中找到的行.输出文件(output.txt)包含65340行.该脚本只需不到10秒即可完成.
内容总结
以上是互联网集市为您收集整理的linux – Bash:如何保持文件中的行具有与另一个文件中的行匹配的字段?全部内容,希望文章能够帮你解决linux – Bash:如何保持文件中的行具有与另一个文件中的行匹配的字段?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。