【发布时间】: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 来实现这个目标吗?
【问题讨论】:
我有一个这样的文本文件:
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 来实现这个目标吗?
【问题讨论】:
你当然可以。方法如下:
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 评估为空字符串。我会小心使用 awk 需要测试的作业。如果您执行awk -F "[ ]" '$2 = toupper($2)' <<< "a b c",它也会中断,其中第二个字段是空刺。可以通过awk 'NF > 1{$2 = toupper($2)} 1' file 轻松修复。
perl -F -ane '$F[1] = lc($F[1]);print "@F"' your_file
【讨论】: