In the below awk when I echo f it is empty, but if I remove the $f I get the desired results, however the new formatting is not stored in the $d variable. Basically I am trying to convert the string in $d variable into a new formatted variable $f. Thank you :).
file
ID,1A
DATE,220102
awk
d=$(awk -F, '/Date/ {print $2}' file) | f=$(date -d "$d" '%Y-%m-%d')
f --- desired ---
2022-01-02
CodePudding user response:
You need to use it this way to return a value from awk and set a shell variable:
f=$(date -d "$(awk -F, '/DATE/ {print $2}' file)" '%Y-%m-%d')
echo "$f"
2022-01-02
CodePudding user response:
With awk:
awk 'BEGIN{FS=","; OFS="-"} $1=="DATE"{ print "20" substr($2,1,2), substr($2,3,2), substr($2,5,2) }' file
Output:
2022-01-02
See: 8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
CodePudding user response:
With your shown samples please try following awk code. Written and tested in GNU awk. Using awk's match function capability to use regex ^DATE,([0-9]{2})([0-9]{2})([0-9]{2})$ for getting required output. This creates 3 capturing groups and stores matched values into array named arr once this match is done then printing 20 and all 3 values of arrays separated by - as per required output.
awk -v OFS="-" '
match($0,/^DATE,([0-9]{2})([0-9]{2})([0-9]{2})$/,arr){
print "20" arr[1],arr[2],arr[3]
}
' Input_file
CodePudding user response:
While the other answers provide a more efficient method of reformatting the date (and assuming OP has no need for d in follow-on code), I'm going to focus solely on a couple issues with OP's current code:
- in the
awkscript need to match for (all caps)DATEinstead ofDate - current code attempts to pipe the output from
d=$(...)to thef=$(...)portion of code; while this does 'work' in thatfwill be assigned2022-01-02the problem is that the assignment tofis performed in a subprocess and upon exiting the subprocessfis effectively 'unassigned'; what OP really needs is to separate thed=$(...)andf=$(...)commands from each other so that both assignments occur in the current shell, and this can be done by replacing the pipe with a semicolon.
If we make these two simple edits:
# old code:
d=$(awk -F, '/Date/ {print $2}' file) | f=$(date -d "$d" '%Y-%m-%d')
^^^^ ^^^
# new code:
d=$(awk -F, '/DATE/ {print $2}' file) ; f=$(date -d "$d" '%Y-%m-%d')
^^^^ ^^^
OP's code will now generate the desired result:
$ echo "${f}"
2022-01-02
CodePudding user response:
the string approaches :
{n,g}awk -F'^[^,]*,' 'gsub("^....|..", "-&", $(_=!(NF*=NF==NR)))\ ($ _ = substr($ _, _ _--))^_' OFS=20
mawk -F'^[^,]*,' '$(gsub("^....|..", "-&", $!(NF*=NF==NR))*(_=!NF)) = substr($_, _ _)' OFS=20 mawk2 'gsub("^....|..", "-&", $!(NF*=NF==NR)) sub(".",_)^_' FS='^. ,' OFS=20
the numeric approach :
mawk -F',' 'NF==NR && ($!NF = sprintf("20%.*s-%.*s-%0*.f", _ =_^=_<_, __ = $NF, _ , substr(__,_), --_, __%(_ _*_*_)^_))'
2022-01-02
