根据内容

时间:2017-02-27 16:46:05

标签: sorting awk sed grep

我有大约1000个来自系统发育分析的文件,每个文件看起来像这样

File 1
   (((A:0.03550734102561460548,B:0.04004337325891465377):0.01263892787244691278,C:0.03773369182398536581):0.08345900687345568503,(D:0.04441859961888914438,((E:0.04707945363105774106,F:0.03769496882665739068):0.00478087012691866091,G:0.01269975716918288373):0.01263526019405349088):0.13087200352448438712,H:1.91169780510990117151):0.0;

File 12

((A:0.11176787864288327545,(B:0.18283029119402782747,C:0.12136417416322728413):0.02367730683755531543):0.21101090994668161849,(((F:0.06464548582830945134,E:0.06903977777526745796):0.01710921464740109560,G:0.01577242071367901746):0.00958883666063858192,D:0.03506359820882300193):0.47082738536589324729,H:2.94973933657097164840):0.0;

我想阅读每个文件的内容,并根据模式(意味着文件内容)对它们进行分类。这里的数字代表分支长度,对于任何文件都不相同。所以,我想根据字母A到H对文件进行分类。比方说,例如所有具有从A到H的字母顺序排列的文件,我想将这些文件排序到单独的文件夹中。例如:

对于File1中的模式,模式将是这样的,忽略数字(分支长度):

   (((A:,B:),C:):,(D:,((E:,F:):,G:):):,H:):;

包含此模式的所有文件都将进入文件夹。     档案1     档案5     档案6     档案10     ....

我知道使用以下方法根据特定模式对内容进行排序:

    grep -l -Z pattern files | xargs -0 mv -t target-directory --  

但是我不知道如何在这种情况下这样做,因为我没有先前的模式知识

1 个答案:

答案 0 :(得分:2)

您可以获取内容模式并对其进行排序

$ for f in file{1..2}; 
     do printf "%s\t" $f; tr -d '[ 0-9.]' <$f; 
     done | 
  sort -k2

file1   (((A:,B:):,C:):,(D:,((E:,F:):,G:):):,H:):;
file2   ((A:,(B:,C:):):,(((F:,E:):,G:):,D:):,H:):;

相同的模式将是连续的。假设每个文件有一条记录。