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