awk использует манипуляции с заглавными буквами и при условии соответствия - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь манипулировать текстовым потоком, где второй столбец должен быть в нижнем регистре вместе с четвертым ... (это работает) Однако в моем случае пятый может содержать слово или слова ... в этом случае,Я хочу использовать заглавные буквы и нижний регистр для остальной части слова (или слов)

cat payload/consolidated.csv | awk -F'","|^"|"$' '{print tolower($2),"~",tolower($4),"~",toupper(substr($5,1,1)) tolower(substr($5,2))}'

, но это не в состоянии использовать заглавные буквы в последующих словах ... это работает только для первого слова в этом пятом столбце соответствия

Идеи?

Аналогично и в качестве продолжения, как бы я поставил условное условие, если для этой пятой колонки будет соответствовать США (пример), что я оставлю это США.и не быть США

Ценится.


Пример ввода данных

"IGNORE","Why","IGNORE","Where","FirstName LastName Country"

Требуемый вывод

why~where~Firstname Lastname Country 

(и тогда я хочу иметь возможность условно изменить страну таким образом, чтобы, если это действительноСША, тогда я игнорирую tolower ())

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Поскольку у меня нет FPAT в моей системе, так что обычно с настройкой разделителя полей FS здесь.

awk '
BEGIN{
  FS="[ |,|\"]"
  s1=" "
  OFS="~"
}
{
  print tolower($5),tolower($11),\
        toupper(substr($14,1,1)) \
        tolower(substr($14,2)) s1 \
        toupper(substr($15,1,1)) \
        tolower(substr($15,2)) s1 \
        toupper(substr($16,1,1)) \
        tolower(substr($16,2))
}'  Input_file

В случае, если вы хотите узнать номер поля и соответствующие значения полейдля строк, то вы можете выполнить следующую команду, это будет eaiser, чтобы понять выше больше.

awk 'BEGIN{FS="[ |,|\"]";OFS="~"} {for(i=1;i<=NF;i++){print i,$i}}'  Input_file
0 голосов
/ 28 февраля 2019

Вот один для GNU awk:

$ awk 'BEGIN {
    FPAT = "([^,]*)|(\"[^\"]+\")"       # using FPAT to separate fields
    OFS="~"                             # output field separator
}
{
    for(i=2;i<=NF;i++)                  # remove quotes from fields
        gsub(/^"|"$/,"",$i)         
    b=""                                # buffer the case play
    while(match($5,/ *[A-Za-z]+ */)) {  # collect the "words" and upper first char, lower rest
        b=b toupper(substr($5,RSTART,1)) tolower(substr($5,RSTART+1,RLENGTH-1)) # sorry 2Pac...
        $5=substr($5,RSTART+RLENGTH)    
    }
    print tolower($2),tolower($4),b
}' file

Вывод:

why~where~Firstname Lastname Country

Ожидание этого примера условного кожуха.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...