2016-08-31 4 views
2

に同じ値で行をマージします:たとえば私がどのように見えるファイルのn個持っている最初の列

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 

はFile1:

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 

File2の:

PACKAGE_LIST_DEV=rpm4 rpm5 
PACKAGE_LIST_PROD=rpm4 rpm5 

ファイル3:

PACKAGE_LIST_DEV=rpm6 rpm7 
PACKAGE_LIST_PROD=rpm6 rpm7 

など..

そして、私は、次の取得したいのですが:

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7 
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7 

PACKAGE_LISTは、最初の列内のすべてのファイルで同じである、それが生成する必要がありそうだとすれば結合された線の他のすべての部分を含む各1行。ここで

は、私が試したものです:

# Concatenate all files together 
cat File1 File2 File3 ... Filen > new_file 

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 
PACKAGE_LIST_DEV=rpm4 rpm5 
PACKAGE_LIST_PROD=rpm4 rpm5 
PACKAGE_LIST_DEV=rpm6 rpm7 
PACKAGE_LIST_PROD=rpm6 rpm7 

# Join PACKAGE_LIST lines together 
awk -F'=' -v OFS='' '{x=$1;$1="=";a[x]=a[x]$0}END{for(x in a)print x,a[x]}' new_file 

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3=rpm4 rpm5=rpm6 rpm7 
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3=rpm4 rpm5=rpm6 rpm7 

ファイル内のキー・フィールドがソートされている場合は、余分=そこ

答えて

3
$ awk 'BEGIN{FS=OFS="="} {a[$1]=($1 in a ? a[$1] " " : "") $2} END{for (i in a) print i, a[i]}' file[1-3] 
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7 
PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7 
1

別の選択肢がある見ることができるようにありますjoinsedを使用してください。

| join -t= - file3部分は、例えば、異なるファイル名で任意の回数を含めることができ
$ join -t= file1 file2 | join -t= - file3 | sed 's/=/ /g;s/ /=/' 
PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7 
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7 

を...:あなたが希望として一緒にできるだけ多くのファイルを結合するには... | join -t= - file4 | join -t= - file5 ...など

解決策はうまくいき、キーフィールドがソートされた順序ではなく、ファイルの内容をメモリに保持しているため、膨大なファイルで問題が発生する可能性があります。ファイルのキーフィールドがソート順である限り、join/sedソリューションは、任意の長さのファイルに対して機能します。

関連する問題