如何为特定字符串对文本文件进行排序?
How I can sort a text file for specific string?
我有一个包含以下行的文本文件:
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"
的行
有什么建议吗?
你几乎必须做两个过滤器。您可以使用 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]=[=12=]; }
END{ for(ln in na) print na[ln]; }' file
但是这种方法会占用大量内存,因为它将非 Ca 部分保留到处理结束。
grep "Ca" file | sort; grep -v "Ca" file | sort
会做你需要的,首先它只会输出包含 "Ca" 的排序行然后它会打印剩余的不包含 "Ca" 注意 grep 中的“-v”参数意思负匹配。
此外,如果您需要输出在一个流中,您可以使用 { && } 语法连接输出,命令如下所示:
{ grep "Ca" file | sort && grep -v "Ca" file | sort; }
这是一个替代解决方案
nl -n rz ca | awk -vOFS="\t" '/Ca/{="#"} {=}1' | sort -k1,1 | cut -f2-
为了简化文件,现在使用制表符分隔。
说明:对行进行编号以保留其他行的顺序,将行号更改为要排序的行的键;排序并丢弃密钥。
我有一个包含以下行的文本文件:
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"
的行有什么建议吗?
你几乎必须做两个过滤器。您可以使用 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]=[=12=]; }
END{ for(ln in na) print na[ln]; }' file
但是这种方法会占用大量内存,因为它将非 Ca 部分保留到处理结束。
grep "Ca" file | sort; grep -v "Ca" file | sort
会做你需要的,首先它只会输出包含 "Ca" 的排序行然后它会打印剩余的不包含 "Ca" 注意 grep 中的“-v”参数意思负匹配。
此外,如果您需要输出在一个流中,您可以使用 { && } 语法连接输出,命令如下所示:
{ grep "Ca" file | sort && grep -v "Ca" file | sort; }
这是一个替代解决方案
nl -n rz ca | awk -vOFS="\t" '/Ca/{="#"} {=}1' | sort -k1,1 | cut -f2-
为了简化文件,现在使用制表符分隔。
说明:对行进行编号以保留其他行的顺序,将行号更改为要排序的行的键;排序并丢弃密钥。