根据值列中的文本在具有不同列的文件中引入换行符

根据值列中的文本在具有不同列的文件中引入换行符

我想根据第一列中的值在具有不同列的文件中引入换行符。

例如:

输入文件:

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800
1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466
1b0y HETATM SF4 A  87
1blu HETATM SF4 A 101
1blu HETATM SF4 A 102


所需输出:

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102


我尝试了 csh 脚本,但没有成功。

#! /bin/csh
set bin = /home/x/bin

foreach i (`cat pdb_ligands | awk '{print $1}'`)
        echo $i
        sed "s/$i/&\n\n/" pdb_ligands > output.txt
end

答案1

$ awk 'NR > 1 && $1 != prev { print "" } { prev = $1 }; 1' pdb_ligands
1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

这会跟踪 中上一行的第一列中的内容prev

如果当前第一列与 不同prev,并且我们不在文件的第一行,则会打印换行符。然后无条件打印所有行。


print ""上面代码中的替代方法是 do $0 = ORS $0,它将换行符(或ORS输出记录分隔符设置为的任何内容)添加到当前记录的开头。

这将在稍后打印该行时产生额外的换行符。

答案2

由于您在 csh 下标记此 pbm,因此这里有一个 cshell-ian 方法来处理它。foreach 循环逐行读取文件 pdb_ligands,然后将行拆分为字段。我们无条件地打印每一行,但发出一个满足所示条件的空行。

  #!/bin/csh -f
  set prev = ""
  @ line_num = 1
  foreach line ( "`cat pdb_ligands`" )
    set fields = ( ${line:x} )
    set curr = "${fields[1]}" 
    if ( "$line_num" > 1 && "$prev" != "$curr" ) echo
    printf '%s\n' "$line" 
    set prev = "$curr"
    @ line_num++
  end

方法-GNU sed。维护两个连续行的模式空间,以便我们可以监视两个连续行之间第一列的任何变化。仅当我们检测到的第一个字段发生变化时,我们才会通过打印空的保留空间来发出空行。

$ sed -Ee '
    $q;N;P
    /^(\S+)\s.*\n\1\s/!{x;p;x;}
    D
' pdb_ligands 

使用 awk 我们读取下一行并找到下一行中当前行第一个字段的索引。如果它出现在开头就意味着匹配。所以我们将 ORS 设置为 RS。否则,将使用空行设置。

$ awk '{ while ( getline t > 0 ) {
      ORS = index(t, $1 FS)-1 ? RS RS : RS
      print; $0 = t }
}1' pdb_ligands 

Perl 遵循与 awk 相同的技术。

$ perl -pae '
    print; $_ = <>;
    /^\Q$F[0]\E\s/ or print $/;
    redo if ! eof;
' pdb_ligands 

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

答案3

    for i in `awk '{if(!seen[$1]++){print $1}}'  filename `; do sed -n '/'$i'/p'  filename ;echo -e "\n"; done



output

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800


1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466


1b0y HETATM SF4 A  87


1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

Python

import re
uniqueele=[]
k=open('filename','r')
for i in k:
    q=i.split(' ')[0]
    if q not in uniqueele:
        uniqueele.append(q)


for g in uniqueele:
    o=re.compile(r'{0}'.format(g))
    t=open('filename','r')
    for h in t:

        if re.search(o,h):
            print h.strip()

    print "\n"

输出

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800


1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466


1b0y HETATM SF4 A  87


1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

相关内容