miller を使用して小文字を大文字に変換し、出力を新しい列に出力します。

miller を使用して小文字を大文字に変換し、出力を新しい列に出力します。

NAME列を列にコピーしたいですNAME-LOWERCASENAME-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 

これら2つのコマンドを組み合わせる方法は?それとも私の目標を達成するための別の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現在の2番目のフィールド()と同じ値を持つ新しい3番目のフィールドを追加します。それから私たちは三項演算子これが最初の行()であることを確認しNR==1、そうであれば2番目のフィールドを文字列($2="NAME-LOWERCASE")に設定し、そうでない場合は2番目のフィールドを最初のフィールドの小文字バージョン($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、「入力ファイルを1行ずつ読み、各行-eで指定されたスクリプトを実行する」という意味です。-l入力から末尾の改行を削除し、各呼び出しに末尾の改行を追加しますprint。の場合、-aフィールドは特殊配列に分割されるので、@F最初のフィールドは、$F[0]$F[1]などです。最後に、特殊変数は出力フィールドの区切り文字です。ここでは、コンマ区切りの出力を印刷するために$,これをaに設定しました。,

スクリプト自体は非常に簡単です。最初$,に設定し、,それが最初の行の場合($.現在の行番号を保存)、最初のフィールドを印刷してから文字列、"NAME-LOWERCASE"2番目のフィールドを印刷し、他のすべての行に印刷します。最初のフィールド、lc($F[0])小文字()の最初のフィールド、2番目のフィールド。

次のように書くことができます。

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

関連情報