shell:多列文件的处理

shell:多列文件的处理

以下格式的列文件,我使用的是 macOS:

 ./tmp/7000_CNE_lig752_cl_0.5| -10.1000| 58
./tmp/7000_CNE_lig1029_cl_0.5| -8.0200| 40
./tmp/7000_CNE_lig183_cl_0.5| -8.0400| 32
./tmp/7000_CNE_lig247_cl_0.5| -8.3000| 28
./tmp/7000_CNE_lig331_cl_0.5| -8.9400| 31
./tmp/7000_CNE_lig578_cl_0.5| -8.2400| 76
./tmp/7000_CNE_lig587_cl_0.5| -8.5800| 35
./tmp/7000_CNE_lig659_cl_0.5| -8.0600| 31
./tmp/7000_CNE_lig679_cl_0.5| -8.7500| 36
./tmp/7000_CNE_lig767_cl_0.5| -8.9600| 86
./tmp/7000_CNE_lig830_cl_0.5| -8.2700| 32
./tmp/7000_CNE_lig841_cl_0.5| -8.1600| 32
./tmp/7000_CNE_lig842_cl_0.5| -8.5700| 33
./tmp/7000_CNE_lig900_cl_0.5| -8.1400| 61
./tmp/7000_CNE_lig931_cl_0.5| -8.9400| 40
./tmp/7000_CNE_lig933_cl_0.5| -8.6200| 101
./tmp/7000_CNE_lig987_cl_0.5| -8.6200| 55
./tmp/7000_CNE_lig996_cl_0.5| -8.2300| 31
./tmp/7000_CNE_lig998_cl_0.5| -8.6800| 48
./tmp/7000_CNE_lig999_cl_0.5| -8.0000| 29
./tmp/7000_CNE_lig1002_cl_0.5| -7.0900| 32
./tmp/7000_CNE_lig1009_cl_0.5| -7.4600| 22
./tmp/7000_CNE_lig1023_cl_0.5| -7.8700| 25
./tmp/7000_CNE_lig1032_cl_0.5| -7.1200| 20
./tmp/7000_CNE_lig1033_cl_0.5| -7.4400| 26
./tmp/7000_CNE_lig118_cl_0.5| -7.4400| 11
./tmp/7000_CNE_lig179_cl_0.5| -7.8000| 26
./tmp/7000_CNE_lig180_cl_0.5| -7.3800| 38
./tmp/7000_CNE_lig24_cl_0.5| -7.3600| 32
./tmp/7000_CNE_lig25_cl_0.5| -7.0600| 26

我需要一些单行 SORT 命令,它将根据第二列从最低到最高对值进行排序。这是我已经尝试使用排序命令的内容:

sort -t'|' -nk2 7000_CNE_TOP.csv
7000_CNE_lig752_cl_0.5| -10.1000| 58
7000_CNE_lig1029_cl_0.5| -8.0200| 40
7000_CNE_lig183_cl_0.5| -8.0400| 32
7000_CNE_lig247_cl_0.5| -8.3000| 28
7000_CNE_lig331_cl_0.5| -8.9400| 31
7000_CNE_lig578_cl_0.5| -8.2400| 76
7000_CNE_lig587_cl_0.5| -8.5800| 35
7000_CNE_lig659_cl_0.5| -8.0600| 31
7000_CNE_lig679_cl_0.5| -8.7500| 36
7000_CNE_lig767_cl_0.5| -8.9600| 86
7000_CNE_lig830_cl_0.5| -8.2700| 32
7000_CNE_lig841_cl_0.5| -8.1600| 32
7000_CNE_lig842_cl_0.5| -8.5700| 33
7000_CNE_lig900_cl_0.5| -8.1400| 61
7000_CNE_lig931_cl_0.5| -8.9400| 40
7000_CNE_lig933_cl_0.5| -8.6200| 101
7000_CNE_lig987_cl_0.5| -8.6200| 55
7000_CNE_lig996_cl_0.5| -8.2300| 31
7000_CNE_lig998_cl_0.5| -8.6800| 48
7000_CNE_lig999_cl_0.5| -8.0000| 29
7000_CNE_lig1002_cl_0.5| -7.0900| 32
7000_CNE_lig1009_cl_0.5| -7.4600| 22
7000_CNE_lig1023_cl_0.5| -7.8700| 25
7000_CNE_lig1032_cl_0.5| -7.1200| 20
7000_CNE_lig1033_cl_0.5| -7.4400| 26
7000_CNE_lig118_cl_0.5| -7.4400| 11
7000_CNE_lig179_cl_0.5| -7.8000| 26
7000_CNE_lig180_cl_0.5| -7.3800| 38
7000_CNE_lig24_cl_0.5| -7.3600| 32

或者使用 -nk 2,2,它给出相同的结果

sort -t'|' -nk2,2 7000_CNE_TOP.csv
7000_CNE_lig752_cl_0.5| -10.1000| 58
7000_CNE_lig1029_cl_0.5| -8.0200| 40
7000_CNE_lig183_cl_0.5| -8.0400| 32
7000_CNE_lig247_cl_0.5| -8.3000| 28
7000_CNE_lig331_cl_0.5| -8.9400| 31
7000_CNE_lig578_cl_0.5| -8.2400| 76
7000_CNE_lig587_cl_0.5| -8.5800| 35
7000_CNE_lig659_cl_0.5| -8.0600| 31
7000_CNE_lig679_cl_0.5| -8.7500| 36
7000_CNE_lig767_cl_0.5| -8.9600| 86
7000_CNE_lig830_cl_0.5| -8.2700| 32
7000_CNE_lig841_cl_0.5| -8.1600| 32
7000_CNE_lig842_cl_0.5| -8.5700| 33
7000_CNE_lig900_cl_0.5| -8.1400| 61
7000_CNE_lig931_cl_0.5| -8.9400| 40
7000_CNE_lig933_cl_0.5| -8.6200| 101
7000_CNE_lig987_cl_0.5| -8.6200| 55
7000_CNE_lig996_cl_0.5| -8.2300| 31
7000_CNE_lig998_cl_0.5| -8.6800| 48
7000_CNE_lig999_cl_0.5| -8.0000| 29
7000_CNE_lig1002_cl_0.5| -7.0900| 32
7000_CNE_lig1009_cl_0.5| -7.4600| 22
7000_CNE_lig1023_cl_0.5| -7.8700| 25
7000_CNE_lig1032_cl_0.5| -7.1200| 20
7000_CNE_lig1033_cl_0.5| -7.4400| 26
7000_CNE_lig118_cl_0.5| -7.4400| 11
7000_CNE_lig179_cl_0.5| -7.8000| 26
7000_CNE_lig180_cl_0.5| -7.3800| 38

答案1

使用sedfor 1 并关闭语言环境对浮点数进行排序。

sed 's=^\./tmp/\([^|]*\)\.txt|=\1|=' 1 | LC_ALL=C sort -t'|' -k2,2n

sed 表达式./tmp/从每行的开头删除,但也删除.txt第一行之前的内容|- 这就是捕获匹配非管道的原因。

我曾经-k2,2根据第二列排序。如果第二列中的值相同,则使用-k2将根据以下列进行排序(我不确定在这种情况下您想要什么)。

答案2

如果./tmp/.txteach 总是每行只出现一次,你可以这样做:

sed 's|\./tmp/||; s|\.txt||' file | sort -t'|' -nk2,2

诀窍是,正如 Choroba 还提到的,使用-k2,2以便仅对第二个字段进行排序。

或者,您可以在 Perl 中完成整个操作:

$ perl -F'\|' -lane 's|\./tmp/||; ## remove the .tmp
                     s|\.txt||;   ## remove the .txt
                     $k{$F[1]}=$_;  ## Use the 2nd field as the key for a hash 
                                    ## and the line as the value
                     }{  ## after the end of the file...
                    ## sort the hash's keys and print its values
                    print $k{$_} for sort {$a<=>$b} keys(%k)' file
7000_CNE_lig1036_cl_0.5| -10.1000| 58
7000_CNE_lig1029_cl_0.5| -8.0200| 40
7000_CNE_lig1023_cl_0.5| -7.8700| 25
7000_CNE_lig1009_cl_0.5| -7.4600| 22
7000_CNE_lig1033_cl_0.5| -7.4400| 26
7000_CNE_lig1032_cl_0.5| -7.1200| 20
7000_CNE_lig1002_cl_0.5| -7.0900| 32
7000_CNE_lig1035_cl_0.5| -6.4100| 22
7000_CNE_lig1027_cl_0.5| -6.2000| 21
7000_CNE_lig1016_cl_0.5| -6.0700| 22
7000_CNE_lig1024_cl_0.5| -5.9800| 35
7000_CNE_lig1019_cl_0.5| -5.9300| 19
7000_CNE_lig1034_cl_0.5| -5.8600| 21
7000_CNE_lig1020_cl_0.5| -5.8000| 18
7000_CNE_lig101_cl_0.5| -5.6200| 19
7000_CNE_lig1003_cl_0.5| -5.4600| 24
7000_CNE_lig1017_cl_0.5| -5.3300| 18
7000_CNE_lig1010_cl_0.5| -5.3000| 21
7000_CNE_lig1001_cl_0.5| -5.2900| 13
7000_CNE_lig1015_cl_0.5| -5.2300| 26
7000_CNE_lig1028_cl_0.5| -5.0700| 20
7000_CNE_lig1018_cl_0.5| -4.9500| 20
7000_CNE_lig1025_cl_0.5| -4.9100| 29
7000_CNE_lig100_cl_0.5| -4.5300| 13

相关内容