2つのフィールドを持つ約16,000行の長さのcsvファイルがあります。最初のフィールドには値のリストが含まれ、2番目のフィールドにはセミコロンで区切られた名前と名前のリストが含まれています。
3, Jack Mackie; Hanna Jones; Mike Freeland; Ollie Downs; Farrah Anderson; Judy John
9, Jewel Woodley; Jean Sullivan; Marcia Robin; Kerry Morton; Joelle Armour; Zakiya Pulwarty; Karen Thornhill; Shurm Ahmet; Ed Aslan; Adam Condell; Zeliha Manners; Joan Johnson
5, Haydn Smart; Andre Henry; Tamara Brownbill; Kelly Withers; Eden Anderson; Naomi Casa; Azaria Amritt; Jamile Newton; Nabahe Durand
最初のフィールドの数値位置に対応する2番目のフィールドにリストされている名前はチームリーダーです。たとえば、最初の行のチームリーダーはMike Freeland(位置3)、2行目のチームリーダーはEdです。アスラン(9位)、3行目はエデン・アンダーソン(5位)だ。すべてのチームリーダーの名前を抽出する必要があります。
チームリーダーの名前をすべて抽出し、それを私のcsvファイルに対して実行してから、新しいファイルに出力するシェルスクリプトを作成しようとしています。
情報を見つけるために「grep」または「awk」と「FS」(FSはスペースの代わりにセミコロンを区切り文字として指定)を使用する方法を調べましたが、その値を最初のフィールドに組み込む方法がわかりません。選択基準として。私が見た例はすべて、既知の値または文字列を取得するためにこれらのコマンドを使用します。ただし、この場合、値の位置(名前と姓)のみがわかります。正しいコマンドをお探しですか?
私は台本を考えることができませんでした。チーム長の名前を抽出するには?
答え1
$ awk -F, '{split($2,names,";"); print names[$1]}' file.csv
Mike Freeland
Ed Aslan
Eden Anderson
答え2
$ awk -F'[,;] ' '{print $($1 + 1)}' file
Mike Freeland
Ed Aslan
Eden Anderson
フィールド区切り文字を'[,;] '
カンマまたはセミコロンの後に空白文字に変更します。次に、最初のフィールドの値を取得し、1つを追加して$1
そのフィールドの値を印刷します$(...)
。
答え3
使用ミラー( mlr
)そして、入力データに空行がないと仮定します。
$ mlr --csv -N put -q 'print clean_whitespace(splita($2, ";")[$1])' file
Mike Freeland
Ed Aslan
Eden Anderson
これにより、unheader CSV入力の2番目のフィールド値が文字配列に分割され、1番目のフィールドの;
値が提供する要素が抽出されます。余分な空白文字は、印刷前に値から削除されます。