Linux 如何使用awk将文件的某个字段更改为大写?

Linux 如何使用awk将文件的某个字段更改为大写?,linux,bash,awk,Linux,Bash,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 我希望输出如下: 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 我想将第二个字段从小写改为大写,并且只更改

我有这样一个文本文件:

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 
我希望输出如下:

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中的字符转换为相应的小写 相对应的人。非字母字符保持不变

图珀(街)

返回字符串str的副本,其中包含所有小写字母 str中的字符转换为相应的大写字母 相对应的人。非字母字符保持不变


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

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

小心:这将删除只有一个字段的行。可能是
awk'($2=toupper($2))| | 1”文件
这会在少于2个字段的行上中断。在这种情况下,该行不会打印为空字符串的
$2
求值。在awk需要测试的地方,我会小心使用作业。如果您执行
awk-F“[]”“$2=toupper($2)”@williampersell,它也会中断:您的解决方案会在带有单个字段的行上添加一个结束空格。