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
これら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