Home > front end >  Extracting lines from 2 files using AWK just return the last match
Extracting lines from 2 files using AWK just return the last match

Time:09-30

Im a bit new using AWK and im trying to print lines in a file1 that a specific field exists in a file2. I copied exactly examples that I found here but i dont know why its just printing only the last match of the file1.

File1

58000
72518
94850

File2

58000;123;abc
69982;456;rty
94000;576;ryt
94850;234;wer
84850;576;cvb
72518;345;ert

Result Expected

58000;123;abc
94850;234;wer
72518;345;ert

What Im getting

94850;234;wer

awk -F';' 'NR==FNR{a[$1] ; next} $1 in a' file1 file2

What im doing wrong?

CodePudding user response:

awk (while usable here), isn't the correct tool for the job. grep with the -f option is. The -f file option will read the patterns from file one per-line and search the input file for matches.

So in your case you want:

$ grep -f file1 file2
58000;123;abc
94850;234;wer
72518;345;ert

(note: I removed the trailing '\' from the data file, replace it if it wasn't a typo)


Using awk

If you did want to rewrite what grep is doing using awk, that is fairly simple. Just read the contents of file1 into an array and then for processing records from the second file, just check if field-1 is in the array, if so, print the record (default action), e.g.

$ awk -F';' 'FNR==NR {a[$1]=1; next} $1 in a' file1 file2
58000;123;abc
94850;234;wer
72518;345;ert

(same note about the trailing slash)

CodePudding user response:

Thanks @RavinderSingh13! The file1 really had some hidden characters and I could see it using cat.

$ cat -v file1
58000^M
72518^M
94850^M

I removed using sed -e "s/\r//g" file1 and the AWK worked perfectly.

  • Related