Awk tutorial: awk merge files base on the keyword

linux awk merge files

Today, I have a problem that requires two files to be merged based on keywords.

This problem was dealt with before, but I forgot it today. . .

Process in previous article: awk NR FNR difference

Here is a detailed record of the process.

Today’s question has two files:


➜ cat test-4.txt
123 34131231
321 13123135
128 34673222
457 34522111
101 23455009
456 90909087
111 23456711


➜ cat test-5.txt

The content of the file test-5.txt is part of the first column of the file test-4.txt.

Need to get this result:

123 34131231
456 90909087
321 13123135
111 23456711

Here you need to use the awk variables NR and FNR.

➜ awk '{print "NR:"NR, " FNR:"FNR, " " $0}' test-4.txt

When it is a single file, the values ​​of the variables NR and FNR are the same.

➜ awk '{print "NR:"NR, " FNR:"FNR, " " $0}' test-4.txt test-5.txt

When it is two files, the value of NR is incremented, and the FNR still starts from 1.

According to this feature: when FNR==NR, the first file is read, FNR! =NR reads the second file.

➜ awk -F' ' 'NR==FNR{a[$1]=$2;}NR!=FNR{print $0, a[$1]}' test-4.txt test-5.txt

#awk -F' ' '{if(NR==FNR) {a[$1]=$2;} else if(NR!=FNR) {print $0, a[$1];}}' test-4.txt test-5.txt

In this way, you can get the desired result.

The following commands are explained in detail below:

0. -F’ ‘

Cut two file contents based on spaces.

1. NR==FNR{a[$1]=$2;}

When it is the first file, the file content is converted into an array.

The array key is the first column content, and the array value is the corresponding second column content.

a[123] = 34131231
a[321] = 13123135
a[128] = 34673222
a[457] = 34522111
a[101] = 23455009
a[456] = 90909087
a[111] = 23456711

2. NR!=FNR{print $0, a[$1]}

When it is the second file, it outputs the contents of its file. At the same time, the content of the array a with the second file content as the key is output.

123 a[123]
456 a[456]
321 a[321]
111 a[111]

a[123] = 34131231
a[456] = 90909087
a[321] = 13123135
a[111] = 23456711

So the result is:

123 34131231
456 90909087
321 13123135
111 23456711


Related post

awk command tutorial in linux/unix with examples and use cases
AWK tutorial: awk custom function and awk example
Awk tutorial: find and kill process use awk
Awk tutorial: awk -F and awk BEGIN{ FS … }
Awk tutorial: awk regex example
Awk tutorial: awk loop example: awk for and while
awk if else, if else if else and awk if else nested example
Awk tutorial: awk NR FNR difference
Awk tutorial: awk sort uniq
Awk tutorial: split on character awk or cut
Awk tutorial: awk newline character
Awk tutorial: three ways of awk execution
How to print tree directory structure in linux/unix
Linux shell batch move files, delete spaces, rename files

Add a Comment

Your email address will not be published. Required fields are marked *