파일의 첫 번째 열만 소문자로 변환

파일의 첫 번째 열만 소문자로 변환

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

관련 정보