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