パラメータが異なる行と列を含む巨大なcsvファイルを解析しています。ただし、一部のフィールドには、カンマを含む引用符の中に広範な説明が含まれています。引用符内のカンマを無視し、列の並べ替えと切り取りを選択する方法は? quote-comma-quoteを区切り文字として追加しようとしましたが、エラー(無効な引数)が発生したか、バックスラッシュで引用符をエスケープしましたが、エラーも発生しました。
sort -k12 -t'","' file
または
cut -f 12 -d '","' file
ファイルの行の例:
"GFYZ01001952.1",99.606,"ASTG2327","PREDICTED: kinesin-like protein NACK1 [Elaeis guineensis]","--","centromeric protein E","Kinesin-like protein NACK1 OS=Arabidopsis thaliana GN=NACK1 PE=1 SV=1","Baculovirus polyhedron envelope protein, PEP, C terminus//Autophagy protein Apg6//Basic region leucine zipper//Protein of unknown function (DUF904)",0.005,3.2,3.5,0.00006
答え1
CSVは構造化文書形式です。したがって、単純なテキスト操作ツールcut
(データが単純でない場合、または)は、CSVファイルを安全かつ便利に処理するのに十分ではありません(フィールドに区切り文字と改行を含めることができますsort
)sed
。awk
代わりに、CSVをサポートする処理ツールを使用することをお勧めします。ミラー(mlr
)。
次のMillerコマンドは、ファイルをヘッダーなしのCSVファイルに解析し、12番目のフィールドに基づいて数値を昇順に並べ替えます。
mlr --csv -N sort -n 12 file
CSVデータにヘッダーがある場合は、その-N
オプションを削除して代わりにヘッダー名を使用してください12
。
mlr --cvs sort -n pvalue file
列 12 を抽出するには、
mlr --csv -N cut -f 12 file
種類そして何が起こっても、私たちは最初の10の結果だけを得ます。
mlr --csv -N sort -n 12 then cut -f 12 then head -n 10 file
-N
繰り返しますが、入力にヘッダーがある場合はそれを削除し、代わりにフィールド名を使用してください。
とともにcsvkitcsvsort
次の結果を得るために使用できるツールキット:
csvsort -H -c 12 file | tail -n +2
(このtail
コマンドは生成されたヘッダーを削除しますcsvsort
)または入力のヘッダーを使用して
csvsort -c pvalue file
個々のフィールドを抽出するには、次のコマンドを使用しますcsvcut
。
csvcut -H -c 12 file
結合するcsvsort
:
csvsort -H -c 12 file | csvcut -c 12 | head -n +2
またはタイトルを使用して、
csvsort -c pvalue file | csvcut -c pvalue
コマンドがないため、csvhead
結果は他の方法で10レコードに制限する必要がありますmlr --csv head -n 10
。
答え2
フィールドはGNU awkを使用して識別できますFPAT
。
$ awk -v FPAT='[^,]*|("([^"]|"")*")' '{for (i=1; i<=NF;i++) print i " <" $i ">"}' file
1 <"GFYZ01001952.1">
2 <99.606>
3 <"ASTG2327">
4 <"PREDICTED: kinesin-like protein NACK1 [Elaeis guineensis]">
5 <"--">
6 <"centromeric protein E">
7 <"Kinesin-like protein NACK1 OS=Arabidopsis thaliana GN=NACK1 PE=1 SV=1">
8 <"Baculovirus polyhedron envelope protein, PEP, C terminus//Autophagy protein Apg6//Basic region leucine zipper//Protein of unknown function (DUF904)">
9 <0.005>
10 <3.2>
11 <3.5>
12 <0.00006>
sort
gawk内でコマンドと同じ操作を実行できますが、cut
実際にこれらの外部コマンドを使用したい場合は、awkを使用して;できます。 NUL出口入力を処理可能なツールに変換し、必要に応じて再変換します(例:GNU awk、切り取り、並べ替え)。
$ awk -v FPAT='[^,]*|("([^"]|"")*")' -v OFS='\n' -v ORS='\0' '{$1=$1} 1' file |
cut -z -f 12 -d $'\n'
0.00006$
$ awk -v FPAT='[^,]*|("([^"]|"")*")' -v OFS='\n' -v ORS='\0' '{$1=$1} 1' file |
sort -z -k 12 -t $'\n' |
awk -v RS='\0' -v ORS='\n' -F '\n' -v OFS=';' '{$1=$1} 1'
"GFYZ01001952.1";99.606;"ASTG2327";"PREDICTED: kinesin-like protein NACK1 [Elaeis guineensis]";"--";"centromeric protein E";"Kinesin-like protein NACK1 OS=Arabidopsis thaliana GN=NACK1 PE=1 SV=1";"Baculovirus polyhedron envelope protein, PEP, C terminus//Autophagy protein Apg6//Basic region leucine zipper//Protein of unknown function (DUF904)";0.005;3.2;3.5;0.00006
バラよりawkを使用してcsvを効率的に解析する最も強力な方法は何ですかより多くの情報を知りたいです。