EDIT: OP told there could be words like "a"
too so handle that case adding following now.
awk '
BEGIN{
s1="\""
num=split("McCartney feat. vs. CD USA NYC",array," ")
for(k=1;k<=num;k++){
temp=tolower(array[k])
ignoreLetters[temp]=array[k]
}
num=split("a the to at in on with and but or",array," ")
for(i=1;i<=num;i++){
smallLetters[array[i]]=array[i]
}
}
/TITLE/{
for(i=2;i<=NF;i++){
front=end=nothing=both=""
if($i~/^"/ && $i!~/"$/){
temp=tolower(substr($i,2))
front=1
}
else if($i ~ /^".*"$/){
temp=tolower(substr($i,2,length($i)-2))
both=1
}
else if($i ~/"$/ && $i!~/^"/){
temp=tolower(substr($i,1,length($i)-1))
end=1
}
else{
temp=tolower($i)
nothing=1
}
if(temp in ignoreLetters){
if(front){
$i=s1 ignoreLetters[temp]
}
else if(end){
$i=ignoreLetters[temp] s1
}
else if(both){
$i=s1 ignoreLetters[temp] s1
}
else if(nothing){
$i=ignoreLetters[temp]
}
}
else if(temp in smallLetters){
if(front){
$i=s1 smallLetters[temp]
}
else if(end){
$i=smallLetters[temp] s1
}
else if(nothing){
$i=smallLetters[temp]
}
else if(both){
$i=s1 smallLetters[temp] s1
}
}
else{
if($i~/^\"/){
$i=substr($i,1,1) toupper(substr($i,2,1)) substr($i,3)
}
else{
$i=toupper(substr($i,1,1)) substr($i,2)
}
}
}
}
1
' Input_file
Could you please try following.
awk '
BEGIN{
s1="\""
num=split("McCartney feat. vs. CD USA NYC",array," ")
for(k=1;k<=num;k++){
temp=tolower(array[k])
ignoreLetters[temp]=array[k]
}
num=split("a the to at in on with and but or",array," ")
for(i=1;i<=num;i++){
smallLetters[array[i]]=array[i]
}
}
/TITLE/{
for(i=2;i<=NF;i++){
front=end=nothing=""
if($i~/^"/){
temp=tolower(substr($i,2))
front=1
}
else if($i ~/"$/){
temp=tolower(substr($i,1,length($i)-1))
end=1
}
else{
temp=tolower($i)
nothing=1
}
if(temp in ignoreLetters){
if(front){
$i=s1 ignoreLetters[temp]
}
else if(end){
$i=ignoreLetters[temp] s1
}
else if(nothing){
$i=ignoreLetters[temp]
}
}
else if(tolower($i) in smallLetters){
$i=tolower(substr($i,1,1)) substr($i,2)
}
else{
if($i~/^\"/){
$i=substr($i,1,1) toupper(substr($i,2,1)) substr($i,3)
}
else{
$i=toupper(substr($i,1,1)) substr($i,2)
}
}
}
}
1
' Input_file
Output will be as follows:
FILE "Two The Beatles Songs.wav" WAVE
TRACK 01 AUDIO
TITLE "Dig a Pony, feat. Paul McCartney"
PERFORMER "The Beatles"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "From Me to You"
PERFORMER "The Beatles"
INDEX 01 03:58:02
What does code take care of:
- It takes care of making mentioned words into small letters.
- It takes care of making some letters as per their style, mentioned by OP in question.
- It takes of rest of fields which DO NOT fall in any of above category and makes their first letter as capital letter.
- Code also takes care of words starting with
"
OR ending with"
too, it will first remove them to check if they are present into user mentioned array or not and later add them as per their position.
1
solved Add an exclude array to an existing awk code