Replace field in the delimited file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Replace field in the delimited file
# 1  
Old 02-28-2018
Replace field in the delimited file

Hi,

I have the requirement similar to the one mentioned in the below thread.

HTML Code:
https://www.unix.com/unix-for-dummies-questions-and-answers/128155-search-replace-string-only-particular-column-delimited-file.html
The only difference is that I need to change the field for row 1,2 and the last rows of the file.

Can anybody help?

Thanks
# 2  
Old 02-28-2018
Would it be possible for you to post an example representing your actual input and output file?

It would help, as well, if you could pin-point what you have tried.
These 2 Users Gave Thanks to Aia For This Post:
# 3  
Old 02-28-2018
Hi Aia, RudiC,

I have two files as below:

File1:

Code:
London:10
NewYork:4
Dubai:3
Manchester:12

File2:

PHP Code:
Sale|3|London|3|28022018
Approval
|3
Agent1
|12|abc|abc|
Agent2|12|abc|abc|
Agent3|12|abc|abc|
Final|
3|All_Total 
Now the requirement to read the 3rd field of file2 i.e. "London" and find the value in File1 against London i.e.10.
Once you have 10 in a variable, replace the second field in File2 i.e. 3 with number 10.


I have been able to do the below so far:
To read 3rd field of File2 I user below:
Code:
var1=`head -1 File2 | awk -F\| '{print $5}'`



To read the corresponding value from File1- I am using below:
Code:
var2=`grep $var1 File1 |cut -d ':' -f 2`

But now I have to update the values in file2 with the var2. I want to update second field of File2 i.e. 3 with var2. I want to replace value only for row 1,2 and the last row.

Hope this will help.

Last edited by vgersh99; 02-28-2018 at 03:32 PM.. Reason: code tags, please
# 4  
Old 02-28-2018
Hi, chetanojha

Would your input File2 be more like this?

Code:
Sale|3|London|3|28022018
Approval|3
Agent1|12|abc|abc|
Agent2|12|abc|abc|
Agent3|12|abc|abc|
Final|3|All_Total
Sale|15|New York|3|28022019
Approval|3
Agent1|12|abc|abc|
Agent2|12|abc|abc|
Agent3|12|abc|abc|
Final|3|All_Total 
Sale|50|Las Palmas|3|28022032
Approval|3
Agent1|12|abc|abc|
Agent2|12|abc|abc|
Agent3|12|abc|abc|
Final|3|All_Total

Would your expected output be like this?
Code:
Sale|10|London|3|28022018
Approval|3
Agent1|12|abc|abc|
Agent2|12|abc|abc|
Agent3|12|abc|abc|
Final|3|All_Total
Sale|4|New York|3|28022019
Approval|3
Agent1|12|abc|abc|
Agent2|12|abc|abc|
Agent3|12|abc|abc|
Final|3|All_Total 
Sale|50|Las Palmas|3|28022032
Approval|3
Agent1|12|abc|abc|
Agent2|12|abc|abc|
Agent3|12|abc|abc|
Final|3|All_Total

# 5  
Old 02-28-2018
Hi...

No. It will always be like below each city. One file per city.

Code:
Sale|3|London|3|28022018 
Approval|3 
Agent1|12|abc|abc| 
Agent2|12|abc|abc| 
Agent3|12|abc|abc| 
Final|3|All_Total

For NewYork - it will be different file. But the rows I want to change is the first, second and last.File can have many rows depending on the no. of Agents.

Last edited by vgersh99; 02-28-2018 at 05:03 PM.. Reason: code tags, PLEASE!
# 6  
Old 02-28-2018
If matching "Final" for the last line is OK, try
Code:
awk '
NR == FNR       {TR[$1] = $2
                 next
                }
FNR == 1        {CITY = $3
                 for (n=split(PLINES, TMP); n; n--) LINES[TMP[n]]
                }

$1 == "Final" ||
FNR in LINES    {$2 = TR[CITY]
                }
1
' FS=: file1 FS=\| OFS=\| PLINES="1|2" file2

This User Gave Thanks to RudiC For This Post:
# 7  
Old 02-28-2018
Dear RudiC, Aia,

This is working perfectly well ...

Thanks a lot.

---------- Post updated at 05:07 PM ---------- Previous update was at 04:57 PM ----------

Is there any chance/way that we increament the counter by 1 before replacing it in file2. So the final output would look like below:

file2(after counter increment by 1)

Code:
Sale|11|London|3|28022018  
Approval|11 
 Agent1|12|abc|abc|  
Agent2|12|abc|abc|  
Agent3|12|abc|abc|  
Final|11|All_Total

And also replicate the same info in file one too. So LONDON:10 in file1 will be now LONDON:11. So file1 will looks like below:

file1 (after update)

Code:
London:11 
NewYork:4 
Dubai:3 
Manchester:12

---------- Post updated at 06:11 PM ---------- Previous update was at 06:04 PM ----------

Code:
awk '
  NR == FNR       {TR[$1] = $2
                   next
                  }
  FNR == 1        {CITY = $3
                   for (n=split(PLINES, TMP); n; n--) LINES[TMP[n]]
                  }
   
  $1 == "Final" ||
  FNR in LINES    {$2 = TR[CITY]+1
                  }
  1
  ' FS=: file1 FS=\| OFS=\| PLINES="1|2" file2

above worked to increment the counter by 1.

So now I only need to work on updating file1.

Last edited by chetanojha; 02-28-2018 at 06:19 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Remove Last field from a delimited file

Hi, I have a '~' delimited file and i want to remove the last field using awk. Please find the sample records below: 1428128~1~0~1100426~003~50220~005~14~0~194801~11~0~3~14~0~50419052335~0~0820652001~2~00653862 ~0~1~0~00126~1~20000110~20110423~R~ ~0~Z~1662.94~ ~002041~0045~Z~... (3 Replies)
Discussion started by: Arun Mishra
3 Replies

2. UNIX for Dummies Questions & Answers

add new 'date field' in a pipe delimited file

i need to add a new field in a pipe delimited line. the field will be the current date today. aa|a|s|w|1 as|oiy|oiy|oiy|2 given that all lines are uniformed in the number of fields i want it to look like this:\ aa|a|s|w|1|20120126 as|oiy|oiy|oiy|2|20120126 please help :) (3 Replies)
Discussion started by: kokoro
3 Replies

3. Shell Programming and Scripting

Extract a nth field from a comma delimited file

Hi, In my file (which is "," delimited and text qualifier is "), I have to extract a particualr field. file1: 1,"aa,b",4 expected is the 2nd field: aa,b I tried the basic cut -d "," -f 2 file 1, this gave me aa alone instead aa,b. A small hint ot help on this will be very... (5 Replies)
Discussion started by: machomaddy
5 Replies

4. Shell Programming and Scripting

Pad zeroes first field in a Delimited file

Need help. I tried using an awk command to pad zeroes. Unfortunately, the "|" pipe delimited character is gone when I tried to write the records to another file. awk -F \| ' {$1=sprintf("%06s", $1); print $0}' $CUSTFINAL2 > $CUSTFINAL3 BEFORE "KEYRECORD"|"SA ID"|"PER ID"|"SP ID"|"ACCT... (3 Replies)
Discussion started by: johnhips
3 Replies

5. Shell Programming and Scripting

sed command to remove the first field from a '|' delimited file

Hi I have a file with fields delimited by |. I need to remove the first field from the file. I tried cut but it just extracts that field. sample.output abc|100|name1 cde|200|name2 efg|300|name3 Output should be sample.output 100|name1 200|name2 300|name3 thanks Var (6 Replies)
Discussion started by: var285
6 Replies

6. Shell Programming and Scripting

replace 3rd field of space delimited text file

how to replace the 3rd colum? Each line begins similarly, but they all ends variously. XX YY 03 variable text here XX YY 03 more variable text here XX YY 03 even more variable text here really long setence XX YY 03 variable numbers also appear 03 11. 123 456 XX YY 03 the occasional comma,... (4 Replies)
Discussion started by: ajp7701
4 Replies

7. UNIX for Dummies Questions & Answers

Insert Field into a tab-delimited file

Hello, I have about 100 files in a directory with fields which are tab delimited. I would like to append the file name as the first field and it has to be done as many times as the total lines in the file. For example, myFile1.txt has the following data: 1 x y z 2 a b ... (5 Replies)
Discussion started by: Gussifinknottle
5 Replies

8. Shell Programming and Scripting

insert a field into a tab delimited file

Hello, Can someone help me to do this with awk or sed? I have a file with multiple lines, each line has many fields separated with a tab. I would like to add one more field holding 'na' in between the first and second fields. old file looks like, 1, field1 field2 field3 ... 2, field1... (7 Replies)
Discussion started by: ssshen
7 Replies

9. Shell Programming and Scripting

Count field frequency in a '|' delimited file

I have a large file with fields delimited by '|', and I want to run some analysis on it. What I want to do is count how many times each field is populated, or list the frequency of population for each field. I am in a Sun OS environment. Thanks, - CB (3 Replies)
Discussion started by: ChicagoBlues
3 Replies

10. UNIX for Dummies Questions & Answers

Replacing a field in pipe delimited TEXT File

Hi, I want to replace a field in a text delimited file with the actual number of records in the same file. HDR|ABCD|10-13-2008 to 10-19-2008.txt|10-19-2008|XYZ DTL|0|5464-1|0|02-02-2008|02-03-2008||||F||||||||| DTL|1|5464-1|1|02-02-2008|02-03-2008|1||JJJ... (3 Replies)
Discussion started by: ravi0435
3 Replies
Login or Register to Ask a Question