我以以下格式收集数据:
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