How to merge two files in awk??
Tom Christiansen
tchrist at convex.COM
Sun Jan 20 06:41:24 AEST 1991
>From the keyboard of @xlab1.uucp ():
: I am not sure if this question has been asked before...
:
: Supposing I have two files with three collumns in each. How do
: I merge the files and generate a single file with six or more
: collumns using shell script? for example if File A has collumns a, c, e
: and File B has collumns b, d, f. I want to generate File C
: with collumns a,b,c,d,e,f. Also it would be nice to be able to
: using the arithematic feature in awk...
This originally went also to comp.unix.internals. I sure wouldn't
say an awk question is a unix internal.
Someone out there may have as paste solution, but I didn't see one.
In old, standard awk, it's really quite cumbersome, as you have to read in
all the first file, then all the second file. I find this to be a pretty
cumbersome solution.
#!/bin/awk -f
{ a[NR] = $1; b[NR] = $2; c[NR] = $3; }
END {
count = NR/2;
for (i = 1; i <= count; i++) {
print a[i], a[i+count], b[i], b[i+count], c[i], c[i+count];
}
}
In gawk (and nawk if you're rich), it's a little easier because you can
redirect getilne from a file, effectively reading two lines and writing
one line each iteration.
#!/usr/gnu/bin/gawk -f
BEGIN {
for (;;) {
if ((getline < ARGV[1]) <= 0) break;
a = $1; c = $2; e = $3;
if ((getline < ARGV[2]) <= 0) break;
b = $1; d = $2; f = $3;
print a, b, c, d, e, f;
}
}
It's also pretty easy in perl:
#!/usr/bin/perl
$[ = 1; $, = " "; $\ = "\n"; # awk emulation
open(F1, $ARGV[1]); open(F2, $ARGV[2]);
while ( (@a = split(' ',<F1>)) && (@b = split(' ', <F2>)) ) {
print $a[1], $b[1], $a[2], $b[2], $a[3], $b[3];
}
Other advantages of perl are:
1) you get better error messages for syntax errors
2) you can symbolically debug your program
3) no limits on lines/fields (gawk is better than nawk at this)
4) can often be made to run faster than awk
5) better usage and i/o failure error messages (i didn't do this here)
If you only have awk and not gawk and perl, you should get them, because
they are both free and compile on a vast array (list? :-) of platforms.
Find them wherever GNUware is stored.
: Finally, how do u specify the "rest of the line" in awk??
I'm not really sure what you mean. The whole line is $0. What's the rest
of the line? You mean fields past the third one?
--tom
--
"Hey, did you hear Stallman has replaced /vmunix with /vmunix.el? Now
he can finally have the whole O/S built-in to his editor like he
always wanted!" --me (Tom Christiansen <tchrist at convex.com>)
More information about the Comp.unix.questions
mailing list