我在 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