awk大写操作,如果匹配则有条件

时间:2019-02-28 13:32:54

标签: bash awk capitalization

我正在尝试处理文本流,其中第二列需要与第四列一起使用小写。.(这可行)但是,就我而言,第五列可能包含一个或多个单词。我想将第一个字母大写,并将其余单词(或多个单词)小写

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

但这无法将后续单词大写。.仅适用于第五列匹配项中的第一个单词

想法?

与之类似,作为后续,我将如何为第五列加上条件,如果它与USA相匹配(例如),则将其保留为USA。而不是美国

赞赏。


样本数据输入

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

所需的输出

why~where~Firstname Lastname Country 

(然后,我希望能够有条件地修改Country,以便如果它实际上是美国,那么我将忽略tolower())

2 个答案:

答案 0 :(得分:1)

这里是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

等待该条件框示例。

答案 1 :(得分:1)

由于我的系统中没有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

如果您想知道行的字段号及其各自的字段值,则可以运行以下命令,这将很容易理解上面的内容。

awk 'BEGIN{FS="[ |,|\"]";OFS="~"} {for(i=1;i<=NF;i++){print i,$i}}'  Input_file