【问题标题】:How can I change a certain field of a file into upper-case using awk?如何使用 awk 将文件的某个字段更改为大写?
【发布时间】:2012-12-24 14:24:27
【问题描述】:

我有一个这样的文本文件:

1 http http 3 4 5 
2 dns dns 4 
3 ftp ftp 4 5 6 8 

我希望输出是这样的:

1 HTTP http 3 4 5 
2 DNS dns 4 
3 FTP ftp 4 5 6 8 

我想将第二个字段从小写更改为大写,并且只更改第二个字段。

注意,某一行的字段数是不固定的。

我可以使用awk 来实现这个目标吗?

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    你当然可以。方法如下:

    awk '$2 = toupper($2)' file
    

    结果:

    1 HTTP http 3 4 5
    2 DNS dns 4
    3 FTP ftp 4 5 6 8
    

    来自手册:

    降低(str)

    返回字符串 str 的副本,全部大写 str 中的字符转换为相应的小写字母 同行。非字母字符保持不变。

    toupper(str)

    返回字符串 str 的副本,全部小写 str 中的字符转换为相应的大写字母 同行。非字母字符保持不变。


    我假设给定您的示例数据,它将至少包含三列,并且您讨论的变量组件适用于包含单词之后的列。如果我错了,您可以简单地添加条件:

    awk 'NF>1 { $2 = toupper($2) }1' file
    

    【讨论】:

    • 小心:这将删除只有一个字段的行。也许awk '($2 = toupper($2)) || 1' file
    • 这会在少于 2 个字段的行上中断。在这种情况下,该行不会打印为 $2 评估为空字符串。我会小心使用 awk 需要测试的作业。如果您执行awk -F "[ ]" '$2 = toupper($2)' <<< "a b c",它也会中断,其中第二个字段是空刺。可以通过awk 'NF > 1{$2 = toupper($2)} 1' file 轻松修复。
    • @WilliamPursell:您的解决方案在具有单个字段的行上添加了一个结尾空格。
    【解决方案2】:
    perl -F -ane '$F[1] = lc($F[1]);print "@F"' your_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2019-07-20
      相关资源
      最近更新 更多