merging of 2 files AWK, SHELL or something else


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting merging of 2 files AWK, SHELL or something else
# 22  
Old 03-19-2009
Thanks a lot, it worked perfectly :-)
But would you mind explaining those complex expressions used in the snippet Smilie
# 23  
Old 03-19-2009
Code:
join -t"|" -11 -21 -o1.1,2.2,1.3,1.4 file1 file2

# 24  
Old 03-20-2009
Quote:
Originally Posted by vidyak
Thanks a lot, it worked perfectly :-)
But would you mind explaining those complex expressions used in the snippet Smilie
Sure,

Quote:
NR == FNR {_[$1] = _[$1] ? _[$1] RS $0 : $0; next }
While reading the first non empty input file (NR == FNR, by the way there is a patch for the latest GNU awk that enables support
for the new blocks BEGINFILE and ENDFILE that help avoid the problems with empty files)
,
build the associative array _ (you can use another name, if you wish Smilie):
for every key ($1) concatenate the associated records.
The ?: is the ternary operator, so the code above implements the following logic:

Code:
_[$1] ?                  # if the value of _[$1] is not null or 0
_[$1] RS $0              # concatenate RS (the current record separator, 
                         # newline in this case) and the current input record $0 
                         # to the existing value
: $0                     # if _[$0] is null or 0 (not yet defined, in this case)
                         # set it to the current input record $0.

So, given your example data, after the first input file is processed
the associative array _ contains the following keys/values:

Code:
key: 
D456 

value:  
D456|1.1|msg d 2|remarks 1
D456|1.2|msg d 3|remarks 2
D456|1.3|msg d 4|remarks 3
D456|1.4|msg d 5|remarks 4

key: 
B234 

value: 
B234|1.1|msg b 2|remarks 1
B234|1.2|msg b 3|remarks 2

The next statement forces awk to immediately stop processing the current record
and go on to the next record. This means that no further rules are executed
for the current record, and the rest of the current rule’s action isn’t executed .
[from the GAWK manual: Effective AWK Programming by Arnold Robbins]

Code:
($1 in _ && $0 = $0 RS _[$1]) || 1

Now processing the second input file.
If the first field matches a key in the _ array
evaluate the second part of the logical short-circuit operator AND (&&):
concatenate RS and the value of the _[$1] to the current record,
i.e. print

Code:
B234|msg b 1|date b 1|other info b 1
B234|1.1|msg b 2|remarks 1
B234|1.2|msg b 3|remarks 2
[...]

Otherwise (|| is logical OR) trigger the default action
(which in awk is print the current record: 1 in boolean context is a synonym for true
(everything different than the null string "" and 0 is considered to be true).

Hope this helps.
# 25  
Old 03-20-2009
Yes indeed, that was very well explained. Thanks a ton.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk Merging multiple files with symbol representing new file

I just tried following ls *.dat|sort -t"_" -k2n,2|while read f1 && read f2; do awk '{print}' $f1 awk FNR==1'{print $1,$2,$3,$4,$5,"*","*","*" }' OFS="\t" $f2 awk '{print}' $f2 donegot following result 18-Dec-1983 11:45:00 AM 18.692 84.672 0 25.4 24 18-Dec-1983 ... (3 Replies)
Discussion started by: Akshay Hegde
3 Replies

2. Shell Programming and Scripting

Merging Files in UNIX shell script

I have the urge to merge some files using unix shell script but I'm very new using this language and I haven't succeeded yet. The requirement is to merge the header, body and footer into one file with the name "ANY-NAME" in below example. To identify which files should be merged, I have flagged... (9 Replies)
Discussion started by: black_soul
9 Replies

3. Shell Programming and Scripting

Merging rows in awk

Hello, I have a data format as follows: Ind1 0 1 2 Ind1 0 2 1 Ind2 1 1 0 Ind2 2 2 0 I want to use AWK to have this output: Ind1 00 12 21 Ind2 12 12 00 That is to merge each two rows with the same row names. Thank you very much in advance for your help. (8 Replies)
Discussion started by: Homa
8 Replies

4. Shell Programming and Scripting

Merging two files in awk

Hi, How I can merge two file columns such as the followings using awk: file 1 2 3 2 2 1 1 file 2 4 3 4 5 7 6 Result: 2 3 4 3 2 2 4 5 1 1 7 6 This is an example, at the end, I will have about 25 files that I want to merge them, it is important for me that the order in the... (7 Replies)
Discussion started by: Homa
7 Replies

5. Shell Programming and Scripting

merging files using awk

Hi, I have 2 files. File 1 chr1 1234 2468 ABC chr1 3456 4567 DEF chr2 5643 6154 XYZ : : : : so on.... File 2 chr1 1500 2500 positive chr1 2500 3500 negative chr1 3000 4500 neutral (10 Replies)
Discussion started by: Diya123
10 Replies

6. Shell Programming and Scripting

AWK Script For Merging Text Files

Hello, I am trying to merge data from two text files. One file (File1) contains a listing of data which includes the trial number in Column 5, while the other text file (File2) contains what category the trial belongs to. Here is a snippet of what File1 looks like. 1 Arrow_ST 9.738 0.905... (2 Replies)
Discussion started by: Jahn
2 Replies

7. Shell Programming and Scripting

awk command : row by row merging of two files

I want to write a scrpit to merge files row wise (actually concatinating) main.txt X Y Z file 1 A B C file 2 1 2 3 now i want the script to check if the file1 is empty or not, if empty then make it like A B C 1 2 3 again to check if second file is empty if not do as done... (0 Replies)
Discussion started by: shashi792
0 Replies

8. Shell Programming and Scripting

awk merging files based on 2 complex conditions

1. if the 1st row IDs of input1 (ID1/ID2.....) is equal to any IDNames of input2 print all relevant values together as defined in the output. 2. A bit tricky part is IDno in the output. All we need to do is numbering same kind of letters as 1 (aa of ID1) and different letters as 2 (ab... (4 Replies)
Discussion started by: ruby_sgp
4 Replies

9. Shell Programming and Scripting

merging of 2 files AWK - part 2

i have try , but i think i will never learn awk :( now i have 2 files : a 1:aaa:2:aaa1 2:bbb:2:bbb1 3:ccc:3:ccc1 b aaa:2 bbb:0 ccc:3 output: for all lines where a.$2 == b.$1 i want to compare a.$3 != b.$2 if true then set err=1 if false set err=0 and print all lines from file a +... (2 Replies)
Discussion started by: pp56825
2 Replies

10. Shell Programming and Scripting

Merging files with AWK filtering and counting lines

Hi there, I have a couple of files I need to merge. I can do a simple merge by concatenating them into one larger file. But then I need to filter the file to get a desired result. The output looks like this: TRNH 0000000010941 ORDH OADR OADR ORDL ENDT 1116399 000000003... (2 Replies)
Discussion started by: Meert
2 Replies
Login or Register to Ask a Question