miller를 사용하여 소문자를 대문자로 변환하고 출력을 새 열에 출력합니다.

miller를 사용하여 소문자를 대문자로 변환하고 출력을 새 열에 출력합니다.

NAME열을 열로 복사하고 싶습니다 NAME-LOWERCASE. NAME-LOWERCASE소문자만 포함해야 합니다. 그렇지 않으면 모든 열의 대문자가 변경되지 않고 그대로 유지되어야 합니다.NAME-LOWERCASE

입력하다

NAME,test
PTC,N
Agri,Y
E-example,N
ForYou,N
Willy Nes,Y

산출

NAME,NAME-LOWERCASE,test
PTC,ptc,N
Agri,agri,Y
E-example,E-example,N
ForYou,foryou,N
Willy Nes,willy nes,Y

다른 열에서 새 열을 만들고 재정렬하는 방법을 알고 있습니다.

mlr -I --csv \
    put '$FIRSTNAME = sub($FULLNAME," .*","")' then \
    reorder -f FULLNAME,LASTNAME,EMAIL,DOMAIN,COMPANY input.csv

대문자를 소문자로 바꾸는 방법을 알아요

mlr --csv -N case -l 

이 두 명령을 결합하는 방법은 무엇입니까? 아니면 내 목표를 달성하기 위한 또 다른 Miller 명령이 있습니까?

답변1

당신이 달리면

mlr --csv put '${NAME-LOWERCASE}=tolower($NAME)' then \
reorder -f NAME,NAME-LOWERCASE,test input.csv

소문자 로 표시됩니다 NAME-LOWERCASE.

NAME,NAME-LOWERCASE,test
PTC,ptc,N
Agri,agri,Y
E-example,e-example,N
ForYou,foryou,N
Willy Nes,willy nes,Y

그것은tolower기능.

답변2

데이터가 실제로 표시된 것처럼 단순하고 ,필드 내에 줄 바꿈이 없으면 다음을 수행할 수 있습니다.

$ awk -F, -v OFS="," '{ $3=$2; } (NR==1) ? $2="NAME-LOWERCASE" : $2=tolower($1)' file
NAME,NAME-LOWERCASE,test
PTC,ptc,N
Agri,agri,Y
E-example,e-example,N
ForYou,foryou,N
Willy Nes,willy nes,Y

여기서는 입력 필드 구분 기호를 쉼표( -F,)로 설정한 다음 OFS특수 변수(출력 필드 구분 기호)를 쉼표( -v OFS=,)로 설정합니다. 그런 다음 각 행에 대해 $3=$2현재 두 번째 필드( )와 동일한 값을 가진 새로운 세 번째 필드를 추가합니다. 그런 다음 우리는삼항 연산자이것이 첫 번째 행( )인지 확인하고 NR==1, 그렇다면 두 번째 필드를 문자열( $2="NAME-LOWERCASE")로 설정하고, 그렇지 않으면 두 번째 필드를 첫 번째 필드의 소문자 버전( $2=tolower($1))으로 설정합니다. 에서 awk표현식이 true로 평가될 때 기본 작업은 행을 인쇄하는 것입니다. 표현식은 항상 true로 평가되므로(항상 첫 번째 행이거나 아니기 때문에) 이로 인해 수정된 모든 행이 인쇄됩니다.


또는 데이터가 표시된 것처럼 간단하다고 가정하면 Perl을 사용할 수 있습니다.

$ perl -F, -lane '$,=","; $. == 1 ? print $F[0],"NAME-LOWERCASE",$F[1] : print $F[0],lc($F[0]), $F[1]' file 
NAME,NAME-LOWERCASE,test
PTC,ptc,N
Agri,agri,Y
E-example,e-example,N
ForYou,foryou,N
Willy Nes,willy nes,Y

Perl을 awk처럼 동작하게 만들고 -a, 주어진 문자를 기준으로 각 입력 행을 분할합니다 -F. 이는 -n"입력 파일을 한 줄씩 읽고 -e각 줄에서 주어진 스크립트를 실행한다"는 의미입니다. -l입력에서 후행 줄바꿈을 제거하고 각 호출에 후행 줄바꿈을 추가합니다 print. 의 경우 -a필드는 특수 배열로 분할되므로 @F첫 번째 필드는 $F[0], 초 $F[1]등입니다. 마지막으로 특수 변수 는 출력 필드 구분 기호입니다. 여기서는 쉼표로 구분된 출력을 인쇄하기 위해 $,이를 a로 설정했습니다 .,

스크립트 자체는 매우 간단합니다. 먼저 로 설정한 $,다음 ,이것이 첫 번째 줄이면( $.현재 줄 번호 저장) 첫 번째 필드를 인쇄하고 그 다음 문자열 "NAME-LOWERCASE", 두 번째 필드를 인쇄하고 다른 모든 줄에 대해 인쇄합니다. 첫 번째 필드, lc($F[0])소문자( )의 첫 번째 필드, 두 번째 필드입니다.

다음과 같이 똑같이 작성할 수 있습니다.

perl -F, -lane '
  if($. == 1){
     print $F[0],"NAME-LOWERCASE",$F[1];
  }
  else{
     print $F[0],lc($F[0]), $F[1];
  }' file 

답변3

사용 awk:

$ awk 'BEGIN{FS=OFS=","} 
{$1 = $1 OFS ((NR==1) ? "NAME-LOWERCASE" : tolower($1)) }1'file

사용 csvsql:

$ csvsql -I --query 'SELECT NAME,lower(NAME) AS "NAME-LOWERCASE",test  FROM file' file.csv

관련 정보