2012-10-14 42 views
0

首先,如果這個問題有更好的標題,那麼我就是耳朵!爲文本文件中的同一個鍵分組多個值以形成單個鍵值對

有沒有更好的方法來做到這一點?

我有一個數據文件input.txt格式如下:

field1=value1 
field2=value2 
field3=value3 
. 
. 
. 
field1=value4 
field2=value5 
field3=value6 

...等,願與落得:

field1,value1 value4 ... valueM 
field2,value2 value5 ... valueN 
field3,value3 value6 ... valueO 

我已經試過:

  1. 生成唯一密鑰:cat input.txt |awk -F"=" '{print $2}' |sort -u > data_key

  2. 遍歷行中data_key

#!/bin/bash 

file=input.txt 
keys=`cat data_key` 

for value in $keys 
do 
    output=`cat $file |grep $value |awk -F"=" '{print $2}' |tr -s '[:space:]' '[ *]' ` 
    echo $value, $output 
done 
+0

是的,有一個更好的辦法。你的方式甚至沒有輸出正確的答案。 – choroba

+0

LOL ...好的...?一定要告訴! ...( - : –

+0

其實,我會非常感興趣的聽到你爲什麼認爲這不能給出正確的答案,我在我的測試中得到了正確的結果 –

回答

1

以下基於awk的解決方案應該可以工作。這使用由字段名稱鍵入的關聯數組。數值在遇到時被連接在一起。

awk -F'=' '{z[$1]=z[$1]" "$2} END{for(i in z){print(i","z[i])}}' file_name.txt 
+0

不錯!請你解釋一下'z [$ 1] = z [$ 1]「」$ 2' ...? rray'z'值爲$ 2'? –

+0

@KM。,是的,z表示一個關聯數組,其中的鍵由field1,field2等填充。當一行中遇到特定鍵時,存儲在該數組中的值與該空格連接,新發現價值。 – iruvar

2
的Perl

溶液。它散列字段,每個字段都與一組值相關聯。不過,輸出行的順序是隨機的。

perl -e 'while (<>) { 
      chomp; 
      ($f, $v) = split /=/, $_, 2; 
      push @{ $h{$f} }, $v; 
     } 
     print "$_,@{ $h{$_} }\n" for keys %h; 
    ' input.txt 
+0

很酷!你能否詳細說明''($ f,$ v)= split/= /,$ _,2;'我不清楚'2'是什麼......?其餘的我sorta get –

+2

2是你想要得到的部分的數量,這意味着'field7 = value_containig_ ='不會分割'='上的值 – choroba

+1

只是改變爲'對於排序鍵%h'給出* some * order – ysth

0
awk -F"=" '{a[$1]=a[$1]","$2;}END{for(i in a)print i,a[i];}' your_file 

如下測試:

> cat temp 
field1=value1 
field2=value2 
field3=value3 
field1=value4 
field2=value5 
field3=value6 
> awk -F"=" '{a[$1]=a[$1]","$2;}END{for(i in a)print i,a[i];}' temp 
field1 ,value1,value4 
field2 ,value2,value5 
field3 ,value3,value6 
> 
相關問題