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