如何提取字符串组并将其附加到文件底部

How to extract group of strings and append it at the bottom of the file

美好的一天,

我有一个文件显示如下:

Bin   1 = 5778    669  753  731  743  752  727  736  667    
Bin   5 =    2      2    0    0    0    0    0    0    0     Bin   7 =   63     36    5    1    1    5    1    5    9    
Bin   9 =    0      0    0    0    0    0    0    0    0     Bin  24 =    2      0    0    0    0    0    0    0    2    
Bin  31 =    0      0    0    0    0    0    0    0    0     Bin  47 =   28      2    4    6    1    2    5    3    5    
Bin  70 =    1      0    0    0    0    0    1    0    0     Bin  95 =    1      0    1    0    0    0    0    0    0    
Bin 120 =    1      0    1    0    0    0    0    0    0     Bin 121 =  162     49   13   11   10    3   10   12   54    
Bin 131 =    7      1    1    2    0    0    1    0    2     Bin 133 =    3      0    0    0    0    0    0    0    3    
Bin 141 =    6      0    0    0    1    0    1    2    2     Bin 560 =    1      0    0    0    1    0    0    0    0    
Bin 620 =    1      0    0    0    1    0    0    0    0     Bin 630 =    2      0    0    1    0    0    0    0    1    
Bin 1250 =    1     0    0    0    0    0    1    0    0     Bin 1410 =    1     0    1    0    0    0    0    0    0    
Bin 2004 =    1     0    0    0    0    0    0    1    0     Bin 2240 =    1     0    0    0    0    1    0    0    0    
Bin 2247 =    1     0    0    1    0    0    0    0    0     Bin 2300 =    1     0    0    0    0    1    0    0    0    
Bin 2309 =    1     0    0    0    1    0    0    0    0     Bin 2310 =    3     1    1    0    0    0    0    0    1    
Bin 2602 =    1     0    0    0    1    0    0    0    0    

我想剪切第二个 "Bin" 模式及其右侧的值,并将其粘贴到文件底部,稍后再对其进行排序。感谢您对我的这个问题的帮助。我只是 unix 命令的新手,并且还在学习它。提前致谢。

我想要这样的输出。

Bin   1 = 5778    669  753  731  743  752  727  736  667    
Bin   5 =    2      2    0    0    0    0    0    0    0     
Bin   7 =   63     36    5    1    1    5    1    5    9    
Bin   9 =    0      0    0    0    0    0    0    0    0     
Bin  24 =    2      0    0    0    0    0    0    0    2    
Bin  31 =    0      0    0    0    0    0    0    0    0     
Bin  47 =   28      2    4    6    1    2    5    3    5    
Bin  70 =    1      0    0    0    0    0    1    0    0     
Bin  95 =    1      0    1    0    0    0    0    0    0    
Bin 120 =    1      0    1    0    0    0    0    0    0     
Bin 121 =  162     49   13   11   10    3   10   12   54    
Bin 131 =    7      1    1    2    0    0    1    0    2     
Bin 133 =    3      0    0    0    0    0    0    0    3    
Bin 141 =    6      0    0    0    1    0    1    2    2     
Bin 560 =    1      0    0    0    1    0    0    0    0    
Bin 620 =    1      0    0    0    1    0    0    0    0     
Bin 630 =    2      0    0    1    0    0    0    0    1    
Bin 1250 =    1     0    0    0    0    0    1    0    0     
Bin 1410 =    1     0    1    0    0    0    0    0    0    
Bin 2004 =    1     0    0    0    0    0    0    1    0     
Bin 2240 =    1     0    0    0    0    1    0    0    0    
Bin 2247 =    1     0    0    1    0    0    0    0    0     
Bin 2300 =    1     0    0    0    0    1    0    0    0    
Bin 2309 =    1     0    0    0    1    0    0    0    0     
Bin 2310 =    3     1    1    0    0    0    0    0    1    
Bin 2602 =    1     0    0    0    1    0    0    0    0

关注,迈克

sed 's/ \(Bin.*\)$/\n/g' file | sort -k 2 -n > outputfile

这将搜索以 space 开头的字符串,然后是 "Bin" 以及直到该行其余部分的任何字符。
放在转义括号中的部分,可以在命令的替换部分用</code>引用。在它之前插入一个换行符。 </p> <p>排序部分接受参数</p> <ul> <li>-k 2(按第二列排序)</li> <li>-n(数字排序)</li> </ul> <p>输出:</p> <pre><code># sed 's/ \(Bin.*\)$/\n/g' your_file | sort -k 2 -n Bin 1 = 5778 669 753 731 743 752 727 736 667 Bin 5 = 2 2 0 0 0 0 0 0 0 Bin 7 = 63 36 5 1 1 5 1 5 9 Bin 9 = 0 0 0 0 0 0 0 0 0 Bin 24 = 2 0 0 0 0 0 0 0 2 Bin 31 = 0 0 0 0 0 0 0 0 0 Bin 47 = 28 2 4 6 1 2 5 3 5 Bin 70 = 1 0 0 0 0 0 1 0 0 Bin 95 = 1 0 1 0 0 0 0 0 0 Bin 120 = 1 0 1 0 0 0 0 0 0 Bin 121 = 162 49 13 11 10 3 10 12 54 Bin 131 = 7 1 1 2 0 0 1 0 2 Bin 133 = 3 0 0 0 0 0 0 0 3 Bin 141 = 6 0 0 0 1 0 1 2 2 Bin 560 = 1 0 0 0 1 0 0 0 0 Bin 620 = 1 0 0 0 1 0 0 0 0 Bin 630 = 2 0 0 1 0 0 0 0 1 Bin 1250 = 1 0 0 0 0 0 1 0 0 Bin 1410 = 1 0 1 0 0 0 0 0 0 Bin 2004 = 1 0 0 0 0 0 0 1 0 Bin 2240 = 1 0 0 0 0 1 0 0 0 Bin 2247 = 1 0 0 1 0 0 0 0 0 Bin 2300 = 1 0 0 0 0 1 0 0 0 Bin 2309 = 1 0 0 0 1 0 0 0 0 Bin 2310 = 3 1 1 0 0 0 0 0 1 Bin 2602 = 1 0 0 0 1 0 0 0 0

awk方法:

awk 'NF>12{ = ORS  }1' file | column -t
  • NF - 字段总数

  • NF>12 - 根据您的预期结果,最大字段数为 12。非空白 序列被视为一个字段

  • = ORS - 在第 13 个字段用记录分隔符 ORS(换行符)

  • 拆分记录

输出:

Bin  1     =  5778  669  753  731  743  752  727  736  667
Bin  5     =  2     2    0    0    0    0    0    0    0
Bin  7     =  63    36   5    1    1    5    1    5    9
Bin  9     =  0     0    0    0    0    0    0    0    0
Bin  24    =  2     0    0    0    0    0    0    0    2
Bin  31    =  0     0    0    0    0    0    0    0    0
Bin  47    =  28    2    4    6    1    2    5    3    5
Bin  70    =  1     0    0    0    0    0    1    0    0
Bin  95    =  1     0    1    0    0    0    0    0    0
Bin  120   =  1     0    1    0    0    0    0    0    0
Bin  121   =  162   49   13   11   10   3    10   12   54
Bin  131   =  7     1    1    2    0    0    1    0    2
Bin  133   =  3     0    0    0    0    0    0    0    3
Bin  141   =  6     0    0    0    1    0    1    2    2
Bin  560   =  1     0    0    0    1    0    0    0    0
Bin  620   =  1     0    0    0    1    0    0    0    0
Bin  630   =  2     0    0    1    0    0    0    0    1
Bin  1250  =  1     0    0    0    0    0    1    0    0
Bin  1410  =  1     0    1    0    0    0    0    0    0
Bin  2004  =  1     0    0    0    0    0    0    1    0
Bin  2240  =  1     0    0    0    0    1    0    0    0
Bin  2247  =  1     0    0    1    0    0    0    0    0
Bin  2300  =  1     0    0    0    0    1    0    0    0
Bin  2309  =  1     0    0    0    1    0    0    0    0
Bin  2310  =  3     1    1    0    0    0    0    0    1
Bin  2602  =  1     0    0    0    1    0    0    0    0

如果文本是结构化的,使用 cut 可能就足够了,例如:

(cut -c1-56 infile; cut -c62- infile) | sort -k2n

输出:

Bin   1 = 5778    669  753  731  743  752  727  736  667
Bin   5 =    2      2    0    0    0    0    0    0    0
Bin   7 =   63     36    5    1    1    5    1    5    9    
Bin   9 =    0      0    0    0    0    0    0    0    0
Bin  24 =    2      0    0    0    0    0    0    0    2    
Bin  31 =    0      0    0    0    0    0    0    0    0
Bin  47 =   28      2    4    6    1    2    5    3    5    
Bin  70 =    1      0    0    0    0    0    1    0    0
Bin  95 =    1      0    1    0    0    0    0    0    0    
Bin 120 =    1      0    1    0    0    0    0    0    0
Bin 121 =  162     49   13   11   10    3   10   12   54    
Bin 131 =    7      1    1    2    0    0    1    0    2
Bin 133 =    3      0    0    0    0    0    0    0    3    
Bin 141 =    6      0    0    0    1    0    1    2    2
Bin 560 =    1      0    0    0    1    0    0    0    0    
Bin 620 =    1      0    0    0    1    0    0    0    0
Bin 630 =    2      0    0    1    0    0    0    0    1    
Bin 1250 =    1     0    0    0    0    0    1    0    0
Bin 1410 =    1     0    1    0    0    0    0    0    0    
Bin 2004 =    1     0    0    0    0    0    0    1    0
Bin 2240 =    1     0    0    0    0    1    0    0    0    
Bin 2247 =    1     0    0    1    0    0    0    0    0
Bin 2300 =    1     0    0    0    0    1    0    0    0    
Bin 2309 =    1     0    0    0    1    0    0    0    0
Bin 2310 =    3     1    1    0    0    0    0    0    1    
Bin 2602 =    1     0    0    0    1    0    0    0    0