用sed或awk删除行
发布时间:2020-12-14 01:22:44 所属栏目:Linux 来源:网络整理
导读:我有一个像这样的文件data.txt. 1BN5.txt2072082111B24.txt8892 我有一个包含文本文件的文件夹F1. F1文件夹中的1BN5.txt文件如下所示. ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C A
我有一个像这样的文件data.txt.
>1BN5.txt 207 208 211 >1B24.txt 88 92 我有一个包含文本文件的文件夹F1. F1文件夹中的1BN5.txt文件如下所示. ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C ATOM 422 C SER A 248 70.124 -29.955 8.226 1.00 55.81 C ATOM 615 H LEU B 208 3.361 -5.394 -6.021 1.00 10.00 H ATOM 616 HA LEU B 211 2.930 -4.494 -3.302 1.00 10.00 H ATOM 626 N MET B 87 1.054 -3.071 -5.633 1.00 10.00 N ATOM 627 CA MET B 87 -0.213 -2.354 -5.826 1.00 10.00 C F1文件夹中的1B24.txt文件如下所示. ATOM 630 CB MET B 87 -0.476 -2.140 -7.318 1.00 10.00 C ATOM 631 CG MET B 88 -0.828 -0.688 -7.575 1.00 10.00 C ATOM 632 SD MET B 88 -2.380 -0.156 -6.830 1.00 10.00 S ATOM 643 N ALA B 92 -1.541 -4.371 -5.366 1.00 10.00 N ATOM 644 CA ALA B 94 -2.560 -5.149 -4.675 1.00 10.00 C 我只需要在1BN5.txt文件中包含207,208,211(第6列)的行.我想删除1BN5.txt文件中的其他行.像这样,我只需要在1B24.txt文件中包含88,92的行. Desired output 1BN5.txt文件 ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C ATOM 615 H LEU B 208 3.361 -5.394 -6.021 1.00 10.00 H ATOM 616 HA LEU B 211 2.930 -4.494 -3.302 1.00 10.00 H 1B24.txt文件 ATOM 631 CG MET B 88 -0.828 -0.688 -7.575 1.00 10.00 C ATOM 632 SD MET B 88 -2.380 -0.156 -6.830 1.00 10.00 S ATOM 643 N ALA B 92 -1.541 -4.371 -5.366 1.00 10.00 N 解决方法
这是使用GNU awk的一种方式.运行如下:
awk -f script.awk data.txt script.awk的内容: /^>/ { file = substr($1,2) next } { a[file][$1] } END { for (i in a) { while ( ( getline line < ("./F1/" i) ) > 0 ) { split(line,b) for (j in a[i]) { if (b[6]==j) { print line > "./F1/" i ".new" } } } system(sprintf("mv ./F1/%s.new ./F1/%s",i,i)) } } 或者,这是单行: awk '/^>/ { file = substr($1,2); next } { a[file][$1] } END { for (i in a) { while ( ( getline line < ("./F1/" i) ) > 0 ) { split(line,b); for (j in a[i]) if (b[6]==j) print line > "./F1/" i ".new" } system(sprintf("mv ./F1/%s.new ./F1/%s",i)) } }' data.txt 如果你有一个比GNU Awk 4.0.0更旧的awk的旧版本,你可以尝试以下方法.运行如下: awk -f script.awk data.txt script.awk的内容: /^>/ { file = substr($1,2) next } { a[file]=( a[file] ? a[file] SUBSEP : "") $1 } END { for (i in a) { split(a[i],b,SUBSEP) while ( ( getline line < ("./F1/" i) ) > 0 ) { split(line,c) for (j in b) { if (c[6]==b[j]) { print line > "./F1/" i ".new" } } } system(sprintf("mv ./F1/%s.new ./F1/%s",2); next } { a[file]=( a[file] ? a[file] SUBSEP : "") $1 } END { for (i in a) { split(a[i],SUBSEP); while ( ( getline line < ("./F1/" i) ) > 0 ) { split(line,c); for (j in b) if (c[6]==b[j]) print line > "./F1/" i ".new" } system(sprintf("mv ./F1/%s.new ./F1/%s",i)) } }' data.txt 请注意,此脚本完全按照您的描述执行.它希望1BN5.txt和1B24.txt等文件驻留在当前工作目录的文件夹F1中.它还会覆盖原始文件.如果这不是所需的行为,请删除system()调用. HTH. 结果: F1 / 1BN5.txt的内容: ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C ATOM 421 CA SER A 207 68.627 -29.819 8.533 1.00 50.79 C ATOM 615 H LEU B 208 3.361 -5.394 -6.021 1.00 10.00 H ATOM 616 HA LEU B 211 2.930 -4.494 -3.302 1.00 10.00 H F1 / 1B24.txt的内容: ATOM 631 CG MET B 88 -0.828 -0.688 -7.575 1.00 10.00 C ATOM 632 SD MET B 88 -2.380 -0.156 -6.830 1.00 10.00 S ATOM 643 N ALA B 92 -1.541 -4.371 -5.366 1.00 10.00 N (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |