I have two files and first one is comma separated file with 6 columns and 3rd column is empty in it. 2nd file is a list of urls.
How would i insert all values from 2nd file in 3rd column of first file ?
Content of first file Ex :
apple,fruits,,healthy,240
grapes,fruits,,healthy,80
Noodles,junk,,unhealthy,80
Content of 2nd file:
httpsxhhscom
httpseightcom
httpsxyzjcom
Each files have same number of records and need to be mapped one to one while inserting.ex: 1st row in 2nd file goes 3rd column of 1st file.
CodePudding user response:
You can do it with awk simply by reading the second file into an index array and then updating the 3rd field in file1. For example:
awk -F, -v OFS="," 'FNR==NR {a[ n]=$1; next} m<=n {$3=a[ m]}1' file2 file1
Explanation
- the option
-F,sets the field separator variable (FS) to",", - the option
-v OFS=","sets the output field separator variable (OFS) to",", FNR == NR(first rule condition) - the file record number (FNR- line number per-file) is equal to the total number of records processed (NR) -- only true for the first file processed byawk.FNRis reset to1for each file read,NRcontinues to increment.- If conditon is true, store the url from the first file processed (
file2) in the indexed arraya[]with indexes1, 2, 3, ....nextskips to the next record (line) at that point. m <= nsecond rule condition - this will only be reached when processing the second file (file1). The 3rd field is updaded to the url stored in arraya[]in order until the end of the second file or whenm > n(if there are more records in the second file than the first)- Note:
mandnare simple variables used as counters for the array index. Inawkwhen a variable is encountered before it is initialized or assigned a value, it's value is0, sonsimple setsn = 1the first time it is used. Whenm <= nis encountered beforemhas been incremented, it's value is0. 1at the end is just shorthand for the default operationprint.
Example Use/Output
With your data in file1 and file2, you would get:
$ awk -F, -v OFS="," 'FNR==NR {a[ n]=$1; next} m<=n {$3=a[ m]}1' file2 file1
apple,fruits,httpsxhhscom,healthy,240
grapes,fruits,httpseightcom,healthy,80
Noodles,junk,httpsxyzjcom,unhealthy,80
To write that out to a file, simply redirect the result to a new file, e.g. > newfile.
CodePudding user response:
If file2 isn't gigantic, might as well pre-read it all :
mawk 'BEGIN { RS="^$"
getline <ARGV[ _]
delete __[split ($(ARGV[_ -! _]=""),__,RS="\n")]
FS = \
OFS = "," } $_=__[NR]' testf2.txt testf1.txt
apple,fruits,httpsxhhscom,healthy,240
grapes,fruits,httpseightcom,healthy,80
Noodles,junk,httpsxyzjcom,unhealthy,80
Tested and confirmed working on gawk 5.1.1, mawk 1.3.4, mawk 1.996, and macos nawk
—- The 4Chan Teller
