如何为特定字符串排序文本文件?

时间:2015-09-03 16:38:42

标签: string bash sorting grep lines

我有一个包含以下行的文本文件:

 Ca4  0.500001 0.000000 0.000000
 C4   0.750001 0.500000 0.000000
 O10  0.750001 0.243180 0.000000
 O8   0.652432 0.628410 -0.779621
 O12  0.847569 0.628410 0.779621
 Ca3  0.120090 0.500000 -3.035668
 C3   0.370090 0.000000 -3.035668
 O9   0.370090 -0.256820 -3.035668
 O7   0.272522 0.128410 -3.815289
 O11  0.467659 0.128410 -2.256048
 Ca1  0.000000 0.000000 0.000000
 C2   0.250000 0.500000 0.000000
 O4   0.250000 0.756820 0.000000
 O6   0.152432 0.371590 -0.779621
 O2   0.347569 0.371590 0.779621
 Ca2  0.620091 0.500000 -3.035668
 C1   0.870091 0.000000 -3.035668
 O3   0.870091 0.256820 -3.035668
 O5   0.772522 -0.128410 -3.815289
 O1   0.967660 -0.128410 -2.256048

我想要做的只是简单地命令行,使“Ca”(字符串)行首先出现,其余行保持不变。

我尝试使用

 grep "Ca" file | sort

但它只在屏幕上打印包含“Ca”

的行

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

你几乎要做两个过滤器。您可以排序,避免使用tee显式打开文件两次:

< file tee >(grep ^Ca > ca) | grep -v ^Ca > noca
cat ca noca > newfile

如果你想在内部对Ca部分进行排序:

< file tee >(grep ^Ca | sort > ca) | grep -v ^Ca > noca
cat ca noca > newfile

如果您不打开文件两次非常重要,可以使用awk:

awk '/^Ca/{ print }
     !/^Ca/{ na[NR]=$0; }
     END{ for(ln in na) print na[ln]; }' file

但是这种方法可以使用大量内存,因为它会保留非Ca部分直到处理结束。

答案 1 :(得分:0)

grep "Ca" file | sort;  grep -v  "Ca" file | sort

会做你需要的,首先它只会输出包含&#34; Ca&#34;的排序行。然后它将打印剩余的不包含&#34; Ca&#34;注意&#34; -v&#34; grep中的参数表示负匹配。

此外,如果您需要输出在一个流中,您可以使用{&amp;&amp; amp;语法命令看起来像这样:

{ grep "Ca" file | sort &&  grep -v  "Ca" file | sort; }

答案 2 :(得分:0)

这是另一种解决方案

 nl -n rz ca | awk -vOFS="\t" '/Ca/{$1="#"$2} {$1=$1}1' | sort -k1,1 | cut -f2-

简化文件现在是分页。

说明:对行进行编号以保留其他行的顺序,将行号更改为要排序的行的键;排序并丢弃密钥。