将表中某列中的小写字母更改为大写字母

将表中某列中的小写字母更改为大写字母

我以以下格式收集数据:

CREDITS,EXPDATE,USER,GROUPS
99,01 jun 2018,sylvain,team:::admin
52,01    dec   2018,sonia,team
52,01    dec   2018,sonia,team
25,01    jan   2019,sonia,team
10,01 jan 2019,sylvain,team:::admin
8,12    jun   2018,öle,team:support

我想将“user”列的第一个字母大写,所有名称都以大写字母而不是小写字母开头。我怎样才能做到这一点?

另外,如何通过删除多余的内容来修改表格:,然后调整列的长度以使其整齐?

答案1

awk可以为您做:

awk '{ $3 = toupper(substr($3,1,1)) substr($3,2) } $3' FS=, OFS=, file
CREDITS,EXPDATE,USER,GROUPS
99,01 jun 2018,Sylvain,team:::admin
52,01    dec   2018,Sonia,team
52,01    dec   2018,Sonia,team
25,01    jan   2019,Sonia,team
10,01 jan 2019,Sylvain,team:::admin
8,12    jun   2018,Öle,team:support

该函数substr具有以下格式substr(s, a, b),它从字符串 s 中返回 b 个字符,从位置 a 开始。参数b是可选的。它可以按给定长度分割字符串。在这里,它仅将第三个字段的第一个字符大写,substr函数采用初始字符串、要提取的第一个字符的第一个索引以及要提取的字符数。如果缺少最后一个参数,则substr采用字符串的所有剩余字符。

话虽如此,substr($3,1,1)将对 $3 的第一个字符以及substr($3,2)其余字符进行求值。

为了删除额外不必要的字符,您可以将输出通过管道传输到sed then 来column调整列的长度

awk '{ $3 = toupper(substr($3,1,1)) substr($3,2) } $3' FS=, OFS=, file | sed -e 's/,/\t/g' -e 's/:/ /g' | awk '{print $1, $2","$3","$4"  "$5" " $6" " $7" "$8}' | column -t
CREDITS  EXPDATE,USER,GROUPS
99       01,jun,2018          Sylvain  team  admin
52       01,dec,2018          Sonia    team
52       01,dec,2018          Sonia    team
25       01,jan,2019          Sonia    team
10       01,jan,2019          Sylvain  team  admin
8        12,jun,2018          Öle      team  support

答案2

我认为不需要像 Goro 的提议那样需要很多管道;它应该可以在一个awk脚本中完成,column如果需要的话,后面跟着:

awk '
    {gsub (/[   ]+/, "/", $2)
     $3 = toupper(substr($3,1,1)) substr($3,2)
     gsub (/,/, "\t")
     gsub (/:+/, " ")
    }
1

' FS=, OFS=, file
CREDITS EXPDATE USER    GROUPS
99      01/jun/2018 Sylvain team admin
52      01/dec/2018 Sonia   team
52      01/dec/2018 Sonia   team
25      01/jan/2019 Sonia   team
10      01/jan/2019 Sylvain team admin
8       12/jun/2018 öle team support

相关内容