Text-Processing
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 -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
使用
sed
1 並關閉區域設置以對浮點數進行排序。sed 's=^\./tmp/\([^|]*\)\.txt|=\1|=' 1 | LC_ALL=C sort -t'|' -k2,2n
sed 表達式
./tmp/
從每行的開頭刪除,但也從.txt
第一行之前刪除|
- 這就是擷取匹配非管道的原因。我曾經專門
-k2,2
根據第二列進行排序。如果第二列中的值相同,則使用將根據以下列進行排序(我不確定在這種情況下您想要什麼)。-k2
如果
./tmp/
and.txt
each 總是每行只出現一次,你可以這樣做: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