【问题标题】:How to convert the first letter of the nth column of a csv file to uppercase?如何将csv文件第n列的第一个字母转换为大写?
【发布时间】:2019-08-18 15:35:30
【问题描述】:

csv 文件中的第 12 列全部大写。有时该列有 3 个单词,但大多数情况下只有 1 个单词。

"one","two","three","four","five","six","seven","eight","nine","ten","eleven","TWELVE","thirteen"

我想将第四列转换为只有第一个字母大写

"one","two","three","four","five","six","seven","eight","nine","ten","eleven","Twelve","thirteen"

我可以把整列变成小写:

awk -F"," 'BEGIN{OFS=","} {$12 = tolower($12); print}' "$tmp_input3" > "$tmp_input4"

那个命令给了我:

"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen"

如何使第12列的第一个字母为大写?

【问题讨论】:

  • toupper( substr( $12, 1, 1 ) ) substr( $12, 2 )
  • edit 你的问题包括minimal reproducible example 简洁、可测试的样本输入和预期输出。不仅包括晴天的情况(例如,包括首字母不是第一个字符的情况,例如7foo bar)。如果不清楚,请参阅How to Ask
  • @WiktorStribiżew 你能纠正我的语法吗? awk -F"," 'BEGIN{OFS=","} {$12 = toupper( substr( $12, 1, 1 ) ) substr( $12, 2 ); print}' "$tmp_input4" > "$tmp_input5"
  • 我猜"$tmp_input4" 包含文件路径,"$tmp_input5" 是新文件路径。
  • 那么 - 没有第一个字符是非字母字符的字段 (10 Downing St.)?没有包含逗号 ("foo, bar") 的字段?脚本可能不需要专门处理其他任何事情?真正想想您的真实数据并发布代表该数据的示例输入/输出 - 不要只是抛出一堆晴天单个小写单词,除非您输入的内容确实如此(从您之前的问题来看,它不是)。

标签: bash csv sed


【解决方案1】:

这可能对你有用(GNU sed):

sed 's/[^",]\+/\L\u&/12' file

这会将长度为一个或多个字符且既不是逗号也不是双引号的第十二个字符串转换为小写,除了第一个字符大写。

【讨论】:

    【解决方案2】:

    你可以使用toupper(substr($12,1,1)) substr($12, 2):

    awk -F"," 'BEGIN{OFS=","} {$12 = toupper(substr($12,1,1)) substr($12, 2)}1' "$tmp_input3" > "$tmp_input4"
    

    也就是说,您将第一个字符转换为大写 toupper(substr($12,1,1)),然后从索引 2 开始附加其余字符。

    online awk demo

    s="1,2,3,4,5,6,7,8,9,10,11,abc def ghi,end"
    awk 'BEGIN{FS=OFS=","} {$12 = toupper(substr($12,1,1)) substr($12, 2)}1' <<< "$s"
    # => 1,2,3,4,5,6,7,8,9,10,11,Abc def ghi,end
    

    【讨论】:

    • 如果第 12 列只有一个单词则失败
    • @CuriousSam 不,它没有,Wiktor 刚刚在您发布示例输入/输出之前回答,所以他不知道您的字段被引用。
    • @CuriousSam 即使是一个字母的单词,它does not fail
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多