Compare multiple arrays elements using awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Compare multiple arrays elements using awk
# 1  
Old 11-25-2016
Compare multiple arrays elements using awk

I need your help to discover missing elements for each box.
In theory each box should have 4 items: ITEM01, ITEM02, ITEM08, and ITEM10.
Some boxes either have a missing item (BOX02 ITEM08) or might have da duplicate item (BOX03 ITEM02) and missing another one (BOX03 ITEM01).

file01.txt

Code:
BOX01 ITEM01
BOX01 ITEM10
BOX01 ITEM08
BOX01 ITEM02
BOX02 ITEM01
BOX02 ITEM02
BOX02 ITEM10
BOX03 ITEM02
BOX03 ITEM10
BOX03 ITEM02
BOX03 ITEM08

Desired output:

Code:
Missing:
BOX02 ITEM08
BOX03 ITEM01

Duplicate items:
BOX03 ITEM02

To solve this presume I first need to create an item array I[$2]++ and then create and a BOX array B[$1]=$2 .
I don#t know how to write the code to check if items from array I exist in B.

To get the I array elements I have used:

Code:
awk '{I[$2]++}END{for (v in I) print v}' file01.txt

# 2  
Old 11-25-2016
If you don't mind reversing the order of the output of the two sections of your output and don't mind a random order of reporting of boxes and items missing from boxes, you could try something like:
Code:
awk '
BEGIN {	print "Duplicate items:"
}
{
	b[$1]
	i[$2]
	if(($1, $2) in c)
		print
	else 	c[$1, $2]
}
END {	printf("\nMissing:\n")
	for(box in b)
		for(item in i)
			if(!((box, item) in c))
				print box, item
}' file01.txt

which, with your sample input file produced the output:
Code:
Duplicate items:
BOX03 ITEM02

Missing:
BOX02 ITEM08
BOX03 ITEM01

This assumes that each box you want to process contains and least one item and assumes that each item that is supposed to appear in all of your boxes appears in at least one of your boxes. If either of these assumptions is incorrect, you could always create another file or two that contain(s) the boxes and items you want to process.

As always, if you want to try this on a Solaris/SunOS system, change awk to /usr/xpg4/bin/awk or nawk.
These 2 Users Gave Thanks to Don Cragun For This Post:
# 3  
Old 11-26-2016
Thank you, that's much appreciated. The solution you provided works well.
Best Regards
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

awk sum of 2 arrays and compare

i'm new to awk, and i've been searching on the forum for sum of a column but all the scripts does sum a column of an entire file. I've a file like this: cat file.txt 1234 5678 5678 1234 I want to use awk to do sum of each column per line not entire file, compare the two then write the... (1 Reply)
Discussion started by: chofred
1 Replies

2. UNIX for Beginners Questions & Answers

Multiply elements of 2 arrays together into another array

So I need to Write an array processing program using a Linux shell programming language to perform the following. Load array X of 20 numbers from an input file X. Load array Y of 20 numbers from an input file Y. Compute array Z by multiply Xi * Yi then compute the square-root of this... (2 Replies)
Discussion started by: sarapham409
2 Replies

3. Shell Programming and Scripting

Sum elements of 2 arrays excluding labels

I'm looking for an efficient way to sum elements from 2 arrays using AWK and preserve header as well as sample names in the output array. I have Ubuntu 16.04 LTS. For example; ARRAY 1 SAMPLE DERIVED ANCESTRAL Sample1 14352 0 Sample2 14352 0 Sample3 14352 0 Sample4 ... (8 Replies)
Discussion started by: Geneanalyst
8 Replies

4. Shell Programming and Scripting

awk arrays comparing multiple columns across two files.

Hi, I'm trying to use awk arrays to compare values across two files based on multiple columns. I've attempted to load file 2 into an array and compare with values in file 1, but success has been absent. If anyone has any suggestions (and I'm not even sure if my script so far is on the right lines)... (4 Replies)
Discussion started by: hubleo
4 Replies

5. Shell Programming and Scripting

awk arrays - compare value in second column to variable

Hello, I am trying to redirect files to a directory by using a config file. The config files is as such: xxxxxx,ID,PathToDirectory xxxxxx,ID2,PathToDirectory2 and so on... I have a variable that should match one of these IDs. I want to load this config file into an awk array, and... (2 Replies)
Discussion started by: jrfiol
2 Replies

6. Shell Programming and Scripting

Compare strings between 2 arrays and print number in AWK

Hi to everyone, Please some help over here. Hi have array a with 6 elements and array b with 3 elements as shown inside BEGIN{} statement. I need help to get the correct sintax (the part in red) to compare if string from array b is in array a and print the number related for each match.... (3 Replies)
Discussion started by: Ophiuchus
3 Replies

7. Shell Programming and Scripting

AWK help: how to compare array elements against a variable

i have an array call ignore. it is set up ignore=34th56 ignore=re45ty ignore=rt45yu . . ignore=rthg34 n is a variable. I have another variable that i read from a different file. It is $2 and it is working the way i expect. array ignore read and print correct values. in the below if... (2 Replies)
Discussion started by: usustarr
2 Replies

8. Shell Programming and Scripting

How to access the elements of two arrays with a single loop using the inbuilt index.

Hi all, I wanted to access two arrays (of same size) using one for loop. Ex: #!/bin/bash declare -a num declare -a words num=(1 2 3 4 5 6 7) words=(one two three four five six seven) for num in ${num} do echo ":$num: :${words}:" done Required Output: :1: :one: (11 Replies)
Discussion started by: 14341
11 Replies

9. Shell Programming and Scripting

PHP arrays as array elements

PHP question...I posted this on the Web Development forum, but maybe this is a better place! I have an SQL query that's pulled back user IDs as a set of columns. Rather than IDs, I want to use their names. So I have an array of columns $col with values 1,7,3,12 etc and I've got an array $person... (3 Replies)
Discussion started by: JerryHone
3 Replies

10. UNIX for Advanced & Expert Users

multiple arrays through awk...

i am v new to awk, well unix as a whole really but im enjoying it alot... im trying to extract some data from a file, and parsing it into arrays, ive trawled for hours on the internet and cant find much when it comes to awk and arrays?? anyway, heres the file: tableA tableB tableC ... (2 Replies)
Discussion started by: newbeenie
2 Replies
Login or Register to Ask a Question