ocelot
1
Hi Forum,
Im trying to write some code to read a file, take a certain dynamic value and write it back to the file at the front of every line.
For example, file.txt is:
SIMPLE=HELLO
CONFIDENTIAL=false
SENDER=false
REQUIRED=true
FEEDBACK=false
UPDATE=false
REQUIRED=false
MAPPING=true
SIMPLE=HELLO2
CONFIDENTIAL=false
SENDER=false
REQUIRED=true
FEEDBACK=false
UPDATE=false
REQUIRED=false
I want it to read the value of "SIMPLE", and return it back to the file at the front like so:
HELLO,SIMPLE=HELLO
HELLO,CONFIDENTIAL=false
HELLO,SENDER=false
HELLO,REQUIRED=true
HELLO,FEEDBACK=false
HELLO,UPDATE=false
HELLO,REQUIRED=false
HELLO,MAPPING=true
HELLO2,SIMPLE=HELLO2
HELLO2,CONFIDENTIAL=false
HELLO2,SENDER=false
HELLO2,REQUIRED=true
HELLO2,FEEDBACK=false
HELLO2,UPDATE=false
HELLO2,REQUIRED=false
Any help/ideas please?
thanks in advance
Ocelot
zaxxon
2
awk -F= '$1 ~ /SIMPLE/ {a=$2; print a","$0; next} {print a","$0}' infile
HELLO,SIMPLE=HELLO
HELLO,CONFIDENTIAL=false
HELLO,SENDER=false
HELLO,REQUIRED=true
HELLO,FEEDBACK=false
HELLO,UPDATE=false
HELLO,REQUIRED=false
HELLO,MAPPING=true
HELLO2,SIMPLE=HELLO2
HELLO2,CONFIDENTIAL=false
HELLO2,SENDER=false
HELLO2,REQUIRED=true
HELLO2,FEEDBACK=false
HELLO2,UPDATE=false
HELLO2,REQUIRED=false
ocelot
3
Hi zaxxon,
thanks for the reply. The solution kinda works...but only for the first 9 lines. It then appends the rest of the file with "false" or "true", e.g.
HELLO,SIMPLE=HELLO
HELLO,CONFIDENTIAL=false
HELLO,SENDER=false
HELLO,REQUIRED=true
HELLO,FEEDBACK=false
HELLO,UPDATE=false
HELLO,REQUIRED=false
HELLO,MAPPING=true
false,TEST1=true
false,TEST2=false,
false,TEST3=false,
false,TEST4=true
etc... any ideas?
thanks!
zaxxon
4
Hm... works with me. I edited the post inbetween since I forgot the "next". Here is the output of my box:
root@isau02:/data/tmp/testfeld> cat infile
SIMPLE=HELLO
CONFIDENTIAL=false
SENDER=false
REQUIRED=true
FEEDBACK=false
UPDATE=false
REQUIRED=false
MAPPING=true
SIMPLE=HELLO2
CONFIDENTIAL=false
SENDER=false
REQUIRED=true
FEEDBACK=false
UPDATE=false
REQUIRED=false
root@isau02:/data/tmp/testfeld> awk -F= '$1 ~ /SIMPLE/ {a=$2; print a","$0; next} {print a","$0}' infile
HELLO,SIMPLE=HELLO
HELLO,CONFIDENTIAL=false
HELLO,SENDER=false
HELLO,REQUIRED=true
HELLO,FEEDBACK=false
HELLO,UPDATE=false
HELLO,REQUIRED=false
HELLO,MAPPING=true
HELLO2,SIMPLE=HELLO2
HELLO2,CONFIDENTIAL=false
HELLO2,SENDER=false
HELLO2,REQUIRED=true
HELLO2,FEEDBACK=false
HELLO2,UPDATE=false
HELLO2,REQUIRED=false
ocelot
5
I think I know why...its because I have another variable called SIMPLE_SET_ID.
Question - how can the awk statement be changed to search on just "SIMPLE" only? I tried putting % around SIMPLE but this didnt work...
thanks
Ocelot
zaxxon
6
In this case you have to tell awk to use explicit field content like
awk -F= '$1 ~ /^SIMPLE$/ {a=$2; print a","$0; next} {print a","$0}' infile
or
awk -F= '$1 == "SIMPLE" {a=$2; print a","$0; next} {print a","$0}' infile
ocelot
7
thats worked perfectly...!
thanks a lot for your help!
ocelot
ocelot
8
Hi,
Just one more query on this...
How can I get the name of the file, eg file.txt appended to the beginning of every line too? eg to get:
file.txt,HELLO,SIMPLE=HELLO
file.txt,HELLO,CONFIDENTIAL=false
file.txt,HELLO,SENDER=false
etc
thanks!
zaxxon
9
awk -F= '$1 ~ /SIMPLE/ {a=$2; print FILENAME,a,$0; next} {print FILENAME,a,$0}' OFS=, file.txt
file.txt,HELLO,SIMPLE=HELLO
file.txt,HELLO,CONFIDENTIAL=false
file.txt,HELLO,SENDER=false
file.txt,HELLO,REQUIRED=true
file.txt,HELLO,FEEDBACK=false
file.txt,HELLO,UPDATE=false
file.txt,HELLO,REQUIRED=false
file.txt,HELLO,MAPPING=true
file.txt,HELLO2,SIMPLE=HELLO2
file.txt,HELLO2,CONFIDENTIAL=false
file.txt,HELLO2,SENDER=false
file.txt,HELLO2,REQUIRED=true
file.txt,HELLO2,FEEDBACK=false
file.txt,HELLO2,UPDATE=false
file.txt,HELLO2,REQUIRED=false