2012-09-22 69 views
1

我是unix的新手,希望能夠執行以下操作,但不確定如何操作。按UNIX shell腳本中的多個字段的唯一值進行排序

以一個文本文件,像行:

TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester 
TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell 
TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester 
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell 
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell 
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester 

和輸出這樣的:

TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester 
TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell 
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell 
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester 

我想腳本能夠找到所有有每個TR值的所有行一個獨特的線值。

謝謝

+1

您可以編輯您的問題包括:(1)樣本輸入,(2)樣本輸出,(3)你到目前爲止的代碼?另外 - 你爲什麼想用C做這個?看起來使用常見的GNU工具'grep'和'sort'和'sed'等會更簡單。 – ruakh

回答

3

因爲你顯然是O.K.與價值觀中隨機選擇了dirdayTIstn,你可以寫:

sort -u -t ';' -k 1,1 -k 6,6 -s <input_file> output_file 

說明:

  • sort效用, 「文本文件排序行」,讓您排序/比較/合併來自文件的行。 (請參閱the GNU Coreutils documentation。)
  • -u--unique選項「只輸出同等運行的第一個」,告訴sort如果兩個輸入行相等,那麼您只需要其中之一。
  • -k POS[,POS2]--key=POS1[,POS2]選項「在POS1(原點1)開始一個鍵,在POS2(結束行)結束它」,告訴sort「鍵」是我們要排序的位置。在我們的例子中,-k 1,1表示一個密鑰由第一個字段(從字段1到字段1)和-k 6,6表示一個密鑰由第六個字段(從字段6到字段6)組成。
  • -t SEP--field-separator=SEP選項告訴sort,我們想用我們的情況SEP —,​​3210 —分離和計算領域。 (否則,它會認爲字段被空格分隔,在我們的例子中,它會將整行視爲單個字段。)
  • -s--stabilize選項「通過禁用最後手段比較來穩定排序」,告訴sort我們只有想要以我們指定的方式比較線條;如果兩條線具有相同的上述定義的「鍵」,則它們被認爲是等同的,即使它們在其他方面有所不同。由於我們使用的是-u,這意味着這意味着其中一個將被丟棄。 (如果我們不使用-u,它只是意味着sort不會相對於彼此重新排序。)
+0

我只想要第一個和第六個字段的獨特組合,我不希望中間值在 – WyldStallyns

+0

@AdamWilner中產生效果:我不明白你的意思:你的示例輸出仍然包含那些中間值。你是說,如果同樣的'TR'和'Line'出現兩次,但是有不同的'day'值,那麼你希望隨機丟棄'day'的值之一嗎? – ruakh

+0

或多或少。我想留下只有線和TR和線的獨特組合。不應該考慮中間的值是否是唯一的。他們碰巧在這段代碼中是一樣的,但我有一個超過8000行的文本文件,它們因行而異 – WyldStallyns