(AWK) Csv列の同じ変数を別のファイルに分割する

(AWK) Csv列の同じ変数を別のファイルに分割する

2つの列を持つtest1.csvファイルがあります。

group,email
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]

私の目標は、最初の列の値に基づいて別々のテキストファイルを作成することです。

たとえば、

最初のファイル名は[Eメール保護]そして包含

[email protected]
[email protected]
[email protected]
[email protected]

最初のファイル名は[Eメール保護]そして包含

[email protected]
[email protected]

など。

このawkコマンドがあります

awk -F"," 'NR==1{header=$0}NR>2&&!a[$1]++{print header > (""$1"")}NR>2{print > (""$1"")}' test1.csv

しかし、ファイル名が正しく指定されているにもかかわらず、結果は私が本当に望むものではありません。

group,email
[email protected],[email protected]
[email protected],[email protected]
[email protected],[email protected]

さらに、.csvファイルが大きすぎるたびに、「Awk:開いたファイルが多すぎます」というメッセージが表示されます。

助けてくれてありがとう。また、sedやgrepなどの他の言語も見てください。

ベストアンサー1

これがあなたに必要なものです:

awk -F ',' 'NR<2{next} p1!=$1&&p1{close(p1)} {p1=$1;print $2>p1}' file
  • NR<2{next}:タイトルをスキップします。
  • p1!=$1&&p1{close(p1)}p1前の行の最初のフィールド()が現在の行の最初のフィールドと異なる場合は、「あまりにも開いているファイル」が発生しないように、古い出力ファイルが閉じられます(まだ開かれていない限り)。そして開くp1)。未設定)。
  • {p1=$1;print $2>p1}:最初のフィールドをp1変数に入れ、2番目のフィールドを最初のフィールド名のファイルに出力します。

file上記のawkでは、提供された例に示されているように、最初のフィールドは同じ行が一緒にグループ化されていると想定しています。そうでない場合、簡単な解決策はawkにソートされた入力を提供し、ヘッダーを明示的にスキップすることです(ヘッダーが最初の行にないため)。

sort file | awk -F ',' '/^group,email$/{next} p1!=$1&&p1{close(p1)} {p1=$1;print $2>p1}'

おすすめ記事