作者 主題: 請問shell script語法sort排序指令問題?  (閱讀 9855 次)

0 會員 與 1 訪客 正在閱讀本文。

rich

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
請問排序二欄位資料時,可以指定一欄正序,一欄反序嗎?

例如資料為:
10.2 25.2
10.2 50.4
10.2 100.8
20.4 25.2
20.4 50.4
20.4 100.8

當排列正序時都很正常,以第二欄排序:
sort -n -t" " -k2 $outfile -o $outfile

得到:
10.2 25.2
20.4 25.2
10.2 50.4
20.4 50.4
10.2 100.8
20.4 100.8

但希望得到第一欄反序第二欄正序時卻出問題:
做法是用二行指令先排序欄位一,再排序欄位二
sort -n -t" " -r -k1 $outfile -o $outfile
sort -n -t" " -k2 $outfile -o $outfile

結果第一行有正確把第一欄反序排列,
但第二行排序欄位二時,卻又把第一欄的資料改成正序
若第二行指令改成
sort -n -t" " +1 -2 $outfile -o $outfile
結果第一欄的資料也一樣亂掉,不是原來的反序,

希望得到的結果是:
20.4 25.2
10.2 25.2
20.4 50.4
10.2 50.4
20.4 100.8
10.2 100.8

請問有正確的做法,或是建議的做法嗎?感謝~ :)

slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #1 於: 2010-09-01 12:49 »
一般的習慣, 一行是一筆記錄, 欄是該筆記錄的某個特定值,
依欄排序只是因為特定值特性不同, 而不會改變該筆記錄的完整性.
所以先依欄 2 排序後, 對應的欄 1 就會跟著異動了.

如果欄 1 與欄 2 原本就不是相關的資料, 或者需要特殊處理,
那就要先打破欄 1 與欄 2 的關係, 例如:
1. 只取欄 1 , 排序成 1'
2. 只取欄 2 , 排序成 2'
將 1' 與 2' 重新組合.
只是這樣的作法不太合一般習慣, 建議朝將資料適當正規化方式考慮
冷笑話: 我的 IP 是 127.0.0.1

rich

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #2 於: 2010-09-01 14:24 »
一般的習慣, 一行是一筆記錄, 欄是該筆記錄的某個特定值,
...

感謝您的答覆
但是上面我表達的不夠清楚,真是抱歉~
其實這二欄是物件的座標值x軸、y軸,所以是不能拆開,
排序是為了要取得需要的路徑,

例如從左到右,由下至上座標為
10.2 25.2
20.4 25.2
10.2 50.4
20.4 50.4
10.2 100.8
20.4 100.8

而y正序、x反序,指的是從右到左、由下至上的座標,排序如下
20.4 25.2 ─┬─同一y軸
10.2 25.2 ─┘
20.4 50.4 ─┬─同一y軸
10.2 50.4 ─┘
20.4 100.8─┬─同一y軸
10.2 100.8─┘

所以x軸的反序要在同一y軸的條件下,並不是真的要把x、y都打散。

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #3 於: 2010-09-01 14:45 »
解法有很多,版上也有問過,a,b欄位先拆開,sort正逆個別吐到兩個檔案,sed + awk + sort ....

shell本身函式不多,又不是很容易懂,就以我的菜鳥功力來說,不如...

php myXYsort.php

看妳那個語言比較熟,環境如果不是很限制的話,perl / java / python 都比純 shell 好用很多。
lifeIsFunWithPHP.

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #4 於: 2010-09-01 16:37 »
先把第一欄全部加上負號,sort 完再把負號拿掉。

dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #5 於: 2010-09-01 16:49 »
代碼: [選擇]
echo '10.2 25.2
10.2 50.4
10.2 100.8
20.4 25.2
20.4 50.4
20.4 100.8' | sort -nk2 | while read line1;do read line2; (echo $line1;echo $line2) | sort -nr; done
邏輯上是這樣
若三行 , 三個 read
若 n 行或不固定 , 就要 tmp_str 比對上一層數字是否變化

但若資料量大 .. 會死



gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #6 於: 2010-09-01 17:34 »
先把第一欄全部加上負號,sort 完再把負號拿掉。

cat <<EOF |sed 's/^/-/'|sort -n -k2 -k1 |sed 's/^-//'
10.2 25.2
20.4 25.2
10.2 50.4
20.4 50.4
10.2 100.8
20.4 100.8
EOF

結果

20.4 25.2
10.2 25.2
20.4 50.4
10.2 50.4
20.4 100.8
10.2 100.8

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17463
    • 檢視個人資料
    • http://www.study-area.org
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #7 於: 2010-09-01 21:43 »
解法有很多,版上也有問過,a,b欄位先拆開,sort正逆個別吐到兩個檔案,sed + awk + sort ....

shell本身函式不多,又不是很容易懂,就以我的菜鳥功力來說,不如...

php myXYsort.php

看妳那個語言比較熟,環境如果不是很限制的話,perl / java / python 都比純 shell 好用很多。

對啊,我也這麼覺得,分開先丟到兩個 file,然後用 paste 合回來就是了。

bunko

  • 懷疑的國中生
  • **
  • 文章數: 67
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #8 於: 2010-09-02 07:02 »
轉到資料庫處理也是一種方法,寫了一篇以樓主的問題為例,使用MySQL讀取文字檔,排序輸出為文字檔.
請參考:
http://phorum.study-area.org/index.php/topic,62409.0.html

rich

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
回覆: 請問shell script語法sort排序指令問題?
« 回覆 #9 於: 2010-09-02 11:34 »
原來方法有這麼多種,有些是我想都想不到的,
我會試試大家提供的方法,
找出一個最適合自己使用的方法。
再次感謝回文的各位大大,感恩~ ;D