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] } }
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]; } }