仅将文件中的第一列转换为小写

仅将文件中的第一列转换为小写

我在 RedHat 上有一个文件,其中包含以下数据:

$ cat hello.txt
mumdfw2as123v USER=wladmin                                                MOUNTPOINT=/apps
MUMFW2as97v.mrshmc.com USER=wladmin                                      MOUNTPOINT=/apps
MUMFW3AS65V USER=user                                                    MOUNTPOINT=DR-/u
MUMDFW3AS66V USER=oracle                                                  MOUNTPOINT=/u
mumdfw3AS69v_oracle ansible_host=mumdfw3as69v USER=oracle                 MOUNTPOINT=/web

我希望仅将第一列转换为小写并将更改保存到同一文件中。

我没有nawk工具,因为我确实使用“nawk”找到了解决方案

你能建议一下吗?

答案1

这是一个简单的方法:

$ awk -F'[ ]' '{$1=tolower($1)}1' file
mumdfw2as123v USER=wladmin                                                MOUNTPOINT=/apps
mumfw2as97v.mrshmc.com USER=wladmin                                      MOUNTPOINT=/apps
mumfw3as65v USER=user                                                    MOUNTPOINT=DR-/u
mumdfw3as66v USER=oracle                                                  MOUNTPOINT=/u
mumdfw3as69v_oracle ansible_host=mumdfw3as69v USER=oracle                 MOUNTPOINT=/web

这只是将$1(第一个字段)更改为小写。1最后的 是“awk打印这一行”的简写。有趣的是,-F'[ ]'我们将输入字段分隔符设置为空格,但因为它以正则表达式(字符类)的形式呈现,所以强制 awk 重新计算输入行,这意味着我们可以保留输入字段的原始间距。输入文件。没有它,我们会得到:

$ awk '{$1=tolower($1)}1' file
mumdfw2as123v USER=wladmin MOUNTPOINT=/apps
mumfw2as97v.mrshmc.com USER=wladmin MOUNTPOINT=/apps
mumfw3as65v USER=user MOUNTPOINT=DR-/u
mumdfw3as66v USER=oracle MOUNTPOINT=/u
mumdfw3as69v_oracle ansible_host=mumdfw3as69v USER=oracle MOUNTPOINT=/web

要就地编辑文件,您可以使用 GNU awk(Linux 系统上的默认设置):

$ gawk -F'[ ]' -i inplace '{$1=tolower($1)}1' file
$ cat file
mumdfw2as123v USER=wladmin                                                MOUNTPOINT=/apps
mumfw2as97v.mrshmc.com USER=wladmin                                      MOUNTPOINT=/apps
mumfw3as65v USER=user                                                    MOUNTPOINT=DR-/u
mumdfw3as66v USER=oracle                                                  MOUNTPOINT=/u
mumdfw3as69v_oracle ansible_host=mumdfw3as69v USER=oracle                 MOUNTPOINT=/web

答案2

@terdon的回答更好,但这里有一种替代方法仅供参考:

$ awk '{match($0,/[^[:space:]]+/); print tolower(substr($0,1,RLENGTH)) substr($0,RLENGTH+1)}' hello.txt
mumdfw2as123v USER=wladmin                                                MOUNTPOINT=/apps
mumfw2as97v.mrshmc.com USER=wladmin                                      MOUNTPOINT=/apps
mumfw3as65v USER=user                                                    MOUNTPOINT=DR-/u
mumdfw3as66v USER=oracle                                                  MOUNTPOINT=/u
mumdfw3as69v_oracle ansible_host=mumdfw3as69v USER=oracle                 MOUNTPOINT=/web

答案3

使用 perl 或 GNU sed:

perl -pe 's/^\S+/\L$&/' file
sed -E 's/^\S+/\L&/' file

+-i如果你想要这个选项

答案4

使用该实用程序,perl我们将记录分割到左侧是非空白、右侧是空格的位置。实际上,我们正在标记字段的结束位置:

perl -F'(?<=\S)(?=\s)' -lane '
  print lc(shift(@F)), @F;
' file.csv

在 Python 中,我们以不同的方式执行此操作,其中我们获取第一个非空白字符(IOW,第一个字段),并通过 re.sub() 方法将其转换为小写。

python3 -c 'import re, sys
with open(sys.argv[1]) as f:
  for l in f:
    print(re.sub(r"\S+",lambda x:x.group(0).lower(),l,1),end="")
' file.csv

相关内容