簡體   English   中英

如何排序多個文本列直到bash中的分隔符

[英]How to sort multiple columns of text up till a delimiter in bash

所以我有一個包含如下所示的txt值的文件:

./run_1920x1080_2000_8_medium.txt encoded 279 frames, 44.63 fps, 1835.78 kb/s
./run_1920x1080_6000_8_medium.txt encoded 279 frames, 29.36 fps, 5504.96 kb/s
./run_1920x1080_2000_8_fast.txt encoded 279 frames, 46.96 fps, 1851.13 kb/s
./run_1920x1080_4000_4_faster.txt encoded 279 frames, 32.74 fps, 3631.55 kb/s
./soccer_1920x1080_4000_6_veryfast.txt encoded 299 frames, 79.48 fps, 4003.93 kb/s
./greenleaves_1920x1080_6000_2_faster.txt encoded 299 frames, 16.12 fps, 6406.48 kb/s
./greenleaves_1920x1080_2000_2_veryslow.txt encoded 299 frames, 2.47 fps, 2076.77 kb/s
./run_1920x1080_2000_6_slower.txt encoded 279 frames, 11.36 fps, 1822.16 kb/s
./greenleaves_1920x1080_2000_6_slower.txt encoded 299 frames, 11.38 fps, 2069.65 kb/s
./soccer_1920x1080_4000_8_faster.txt encoded 299 frames, 53.87 fps, 3970.18 kb/s
./soccer_1920x1080_6000_6_superfast.txt encoded 299 frames, 126.51 fps, 6068.11 kb/s
./greenleaves_1920x1080_2000_8_slow.txt encoded 299 frames, 17.96 fps, 2055.69 kb/s
./greenleaves_1920x1080_2000_10_superfast.txt encoded 299 frames, 137.57 fps, 2081.60 kb/s
./greenleaves_1920x1080_6000_10_ultrafast.txt encoded 299 frames, 286.71 fps, 6548.01 kb/s
./run_1920x1080_6000_4_medium.txt encoded 279 frames, 19.01 fps, 5452.17 kb/s
./soccer_1920x1080_2000_4_medium.txt encoded 299 frames, 28.57 fps, 1965.14 kb/s
./greenleaves_1920x1080_6000_10_veryslow.txt encoded 299 frames, 5.55 fps, 6551.35 kb/s
./soccer_1920x1080_2000_10_medium.txt encoded 299 frames, 37.78 fps, 1947.80 kb/s
./run_1920x1080_4000_2_faster.txt encoded 279 frames, 18.91 fps, 3637.35 kb/s
./run_1920x1080_6000_10_slower.txt encoded 279 frames, 9.22 fps, 5580.57 kb/s
./greenleaves_1920x1080_6000_4_slow.txt encoded 299 frames, 8.22 fps, 6387.91 kb/s
./greenleaves_1920x1080_2000_4_veryfast.txt encoded 299 frames, 63.49 fps, 2090.72 kb/s
./run_1920x1080_6000_8_superfast.txt encoded 279 frames, 127.40 fps, 5464.33 kb/s
./run_1920x1080_4000_2_slow.txt encoded 279 frames, 7.72 fps, 3638.49 kb/s
./run_1920x1080_2000_6_slow.txt encoded 279 frames, 18.94 fps, 1832.48 kb/s
./run_1920x1080_6000_10_superfast.txt encoded 279 frames, 124.19 fps, 5477.19 kb/s

目標是按以下順序對文件進行排序:

  1. 第1列(文件名)
  2. 第5欄(預設)
  3. 第4欄(主題)
  4. 第3列(比特率)

我做的是以下內容:

sort -t_ -k1,1 -k5,5 -k4,4

我能夠生成:

./soccer_1920x1080_6000_10_ultrafast.txt encoded 299 frames, 289.95 fps, 6213.30 kb/s
./soccer_1920x1080_6000_8_ultrafast.txt encoded 299 frames, 297.17 fps, 6161.19 kb/s
./soccer_1920x1080_2000_6_ultrafast.txt encoded 299 frames, 309.66 fps, 2007.68 kb/s
./soccer_1920x1080_2000_8_ultrafast.txt encoded 299 frames, 313.22 fps, 2008.35 kb/s
./soccer_1920x1080_4000_6_ultrafast.txt encoded 299 frames, 326.60 fps, 4043.20 kb/s
./soccer_1920x1080_2000_10_ultrafast.txt encoded 299 frames, 328.80 fps, 2002.80 kb/s
./soccer_1920x1080_2000_2_ultrafast.txt encoded 299 frames, 53.80 fps, 1998.31 kb/s
./soccer_1920x1080_4000_2_ultrafast.txt encoded 299 frames, 80.76 fps, 4001.73 kb/s
./soccer_1920x1080_6000_2_ultrafast.txt encoded 299 frames, 94.61 fps, 6017.98 kb/s
./soccer_1920x1080_2000_2_veryfast.txt encoded 299 frames, 29.26 fps, 1983.19 kb/s
./soccer_1920x1080_6000_2_veryfast.txt encoded 299 frames, 30.87 fps, 6123.24 kb/s
./soccer_1920x1080_4000_2_veryfast.txt encoded 299 frames, 42.24 fps, 4021.40 kb/s
./soccer_1920x1080_6000_4_veryfast.txt encoded 299 frames, 56.77 fps, 6104.80 kb/s
./soccer_1920x1080_4000_4_veryfast.txt encoded 299 frames, 58.16 fps, 4006.02 kb/s
./soccer_1920x1080_2000_4_veryfast.txt encoded 299 frames, 59.07 fps, 1968.70 kb/s
./soccer_1920x1080_6000_8_veryfast.txt encoded 299 frames, 72.76 fps, 6125.40 kb/s
./soccer_1920x1080_4000_8_veryfast.txt encoded 299 frames, 75.88 fps, 3988.52 kb/s
./soccer_1920x1080_2000_8_veryfast.txt encoded 299 frames, 78.52 fps, 1952.13 kb/s
./soccer_1920x1080_4000_6_veryfast.txt encoded 299 frames, 79.48 fps, 4003.93 kb/s
./soccer_1920x1080_6000_6_veryfast.txt encoded 299 frames, 81.29 fps, 6141.92 kb/s
./soccer_1920x1080_4000_10_veryfast.txt encoded 299 frames, 82.81 fps, 3987.88 kb/s
./soccer_1920x1080_6000_10_veryfast.txt encoded 299 frames, 83.13 fps, 6148.43 kb/s
./soccer_1920x1080_2000_10_veryfast.txt encoded 299 frames, 84.36 fps, 1953.51 kb/s
./soccer_1920x1080_2000_6_veryfast.txt encoded 299 frames, 85.84 fps, 1966.70 kb/s
./soccer_1920x1080_6000_2_veryslow.txt encoded 299 frames, 2.11 fps, 6100.42 kb/s

我無法正確排序第4列,因為第5列被認為是最后一列“_”之后的所有內容。 那么如何在忽略“.txt”后第5列中的所有內容的同時對輸入進行排序?

不完美的解決方案是將列5定義為固定長度字段: -k5,5.8 這假設該字段中的任何兩個不同的值在前八個字符中都不同,並且所有值至少為七個字符長(包括空格不應更改任何內容)。

順便說一句,數字字段應該有n修飾符 - -k4,4n - 所以10不會在8之前排序。

如果上面的數字8沒有合適的值,那么您唯一的選擇是在排序之前將線分開並在之后恢復它們。 例如:

sed 's/ /_/' file |
sort -t_ -k1,1 -k5,5 -k4,4n -k3,3n |
sed 's/\(\([^_]*_)\{4\}[^_]*\)_/\1 /'

第一個sed將每行的第一個空格更改為下划線,第二個sed將第五個下划線更改回空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM