awkで複数のファイルを一列目をkeyに併合(マージ)。

awkで複数のファイルを一列目をkeyに併合(マージ)。
とても無理やり。
file1.txt

1 3
2 3
3 4
5 6

file2.txt

1 A
2 B
5 D

file3.txt

1 a
2 b
3 c

から、ファイルを併合し
marge.csv

1,3,A,a
2,3,B,b
3,4,,c
5,6,D,

を作成。

awk -f heigou.awk file1.txt file2.txt file3.txt > marge.csv

$ cat heigou.awk
BEGIN{
        for(i in ARGV){
                if(i>=1 && i<(length(ARGV)-1)){
                        str=""
                        for(j=1;j<=(i-1);j++){
                                str=str","
                        }

                        while((getline f <ARGV[i])> 0){
                                split(f,abc," ")
                                jisuu[abc[1]]=jisuu[abc[1]]""abc[2];
                        }
                        for(k in jisuu){
                                split(jisuu[k],tmp,",")
                                if(length(tmp)==1){
                                        jisuu[k]=str""jisuu[k]
                                }
                                jisuu[k]=jisuu[k]","
                        }
                }
                if(i==(length(ARGV)-1)){
                        str=""
                        for(j=1;j<=(i-1);j++){
                                str=str","
                        }
                        while((getline f <ARGV[i])> 0){
                                split(f,abc," ")
                                jisuu[abc[1]]=jisuu[abc[1]]""abc[2];
                        }

                        for(k in jisuu){
                                split(jisuu[k],tmp,",")
                                if(length(tmp)==1){
                                        jisuu[k]=str""jisuu[k]
                                }
                        }
                }
                        close(ARGV[i]) ;
        }
        for(k in jisuu){
                print k","jisuu[k]
        }
}

c言語と違い、変数がグローバル変数
扱いになるので注意。


awkaでC言語に翻訳できるバージョン

$ cat heigou2.awk
function length2(a){
str2=0;
for(i123 in a){
        str2=str2+1;
}
return str2;
}



BEGIN{
        for(i in ARGV){
                #print i,ARGV[i];
                k123= length2(ARGV);
                #i2=i+0.0;
                #tf=(i2>=1)
                #print "i=",i,"i2="i2,"k123="k123-1;
                #tf2=i2<(k123-1) ;

                #print tf,tf2;
                if(i>=1 && i< (k123-1) ){
                        str="";
                        for(j=1;j<=(i-1);j++){
                                str=str","      ;
                        }
                        #print str;
                        while((getline f <ARGV[i])> 0){
                                split(f,abc," ");
                                jisuu[abc[1]]=jisuu[abc[1]]""abc[2];
                        }
                        #print "abcdef";

                        for(k2 in jisuu){
                                split(jisuu[k2],tmp,",")        ;
                                if(length2(tmp)==1){
                                        jisuu[k2]=str""jisuu[k2];
                                }
                                jisuu[k2]=jisuu[k2]",";
                                #print "hello1" ;

                        }
                }
                if(i==(length2(ARGV)-1)){
                        str="";
                        for(j=1;j<=(i-1);j++){
                                str=str","      ;
                        }
                        while((getline f <ARGV[i])> 0){
                                split(f,abc," ");
                                jisuu[abc[1]]=jisuu[abc[1]]""abc[2];
                        }

                        for(k3 in jisuu){
                                split(jisuu[k3],tmp,",");
                                if(length2(tmp)==1){
                                        jisuu[k3]=str""jisuu[k3];
                                }

                        }
                }
                        close(ARGV[i]) ;
        }
        for(k123 in jisuu){
                print k123","jisuu[k123];
        }
}