2013-05-19 32 views
-3

我想編寫一個UNIX腳本,請執行下列操作有FF結果:如何重新排列文本文件輸出結果

textfile1包含以下文本:

keyval1,1 
    keyval1,2 
    keyval1,3 
    keyval1,4 
    keyval2,1 
    keyval2,2 
    keyval3,1 
    keyval4,1 
    keyval4,3 
    keyval4,4 

預期結果:

keyval1 (1,2,3,4) 
    keyval2 (1,2) 
    keyval2 (1) 
    keyval4 (1,3,4) 

謝謝。

我是新來的unix,這是我迄今爲止所做的。這不是尚未雖然:(

#!/bin/ksh 
f1 = 'cut -d "," -f 1 keyval.txt' 
f2 = 'cut -d "," -f 2 keyval.txt' 
while f1 <> f2 
do 
echo f1 "("f2")" 
done > output.txt 
+1

而你在哪裏打? –

+0

^h我,我更新了我的帖子。 – mysticfalls

回答

2

您可以輕而易舉做到這一點使用AWK工作:

#!/usr/bin/awk -f 
BEGIN { 
    FS = "," 
    closeBracket = "" 
} 

{ 
    if (key != $1) 
    { 
     key = $1 
     printf "%s%s (%s", closeBracket, key, $2 
    } 
    else 
    { 
     printf ",%s", $2 
    } 

    closeBracket = ")\n" 
} 

END { 
    printf "%s", closeBracket 
} 
+0

嗨,感謝您的回覆,但它似乎沒有工作..什麼是在if語句中的鍵的價值? – mysticfalls

+1

它作爲空字符串開始,但在讀入一行後,它成爲第一個字段(例如keyval1,keyval2)。你如何運行它,輸出是什麼? **(1)**將代碼放入一個文件(例如'group.awk'),設置執行權限('chmod + x group.awk'),然後使用'./group.awk '運行,或**(2)**在命令行輸入全部內容:'awk'BEGIN ...}''。 – tom

+0

明白了!在#/ usr/bin ...謝謝!!!請問是什麼使用%s? – mysticfalls

3

有點遲到了,但我有這樣一個奠定左右,幾乎是:

#!/usr/bin/perl 
while (<>) 
{ 
    /(.+),(.?+)\s*/; 
    push @{$h{$1}}, $2; 
} 
print map {"$_ (" . join(',', @{$h{$_}}) . ")\n"} sort keys %h; 

不是特別漂亮,但它完成這項工作。