sedまたはawkを使用してCSVファイルを操作する方法は?

sedまたはawkを使用してCSVファイルを操作する方法は?

sedCSVファイルに対して次の操作をどのように使用または実行できますかawk

  • 列を削除
  • 列のコピー
  • 1列移動

200行以上の大きなテーブルがありますsed

ベストアンサー1

CSVファイルがカンマのみを区切り文字として使用するのか、それとも次のようなクレイジーな内容があるのか​​によって異なります。

フィールド 1、「フィールド、2」、フィールド 3

単純なCSVファイルを使用するとします。

列を削除

さまざまな方法で個々の列を削除できます。たとえば、列2を使用します。最も簡単な方法はおそらくを使用することですcut。これにより、印刷する区切り文字-dとフィールドを指定できます-f。これにより、コンマに分割してフィールド1とフィールド3を最後まで出力します。

$ cut -d, -f1,3- /path/to/your/file

必ず使用する必要がある場合は、最初のフィールド、3番目のフィールド、および残りのフィールドを一致させる正規表現を作成し、2番目のフィールドの出力をスキップsedできます(ここでは2なので、最初のグループは一致時間です)。n-1nnn1\{1\}

$ sed 's/\(\([^,]\+,\)\{1\}\)[^,]\+,\(.*\)/\1\3/' /path/to/your/file

これを行うにはいくつかの方法がありますが、awkその中に特にエレガントな方法はありません。ループを使用できますが、for末尾のコンマを処理するのは次のように痛いです。

$ awk -F, '{for(i=1; i<=NF; i++) if(i != 2) printf "%s,", $i; print NL}' /path/to/your/file

フィールド1を出力し、それを使用してsubstrフィールド2以降のすべてを完了する方が簡単です。

$ awk -F, '{print $1 "," substr($0, length($1)+length($2)+3)}' /path/to/your/file

しかし、追加の列では面倒です。

列のコピー

これはデフォルトでsedは以前と同じ式ですが、ターゲット列をキャプチャし、代替項目にグループを複数回含めます。

$ sed 's/\(\([^,]\+,\)\{1\}\)\([^,]\+,\)\(.*\)/\1\3\3\4/' /path/to/your/file

forループ方式では、awk次のようになります(やはり末尾のコンマを無視します)。

$ awk -F, '{
for(i=1; i<=NF; i++) {
    if(i == 2) printf "%s,", $i;
    printf "%s,", $i
}
print NL
}' /path/to/your/file

方法substr:

$ awk -F, '{print $1 "," $2 "," substr($0, length($1)+2)}' /path/to/your/file

(tcdylはより良いアプローチを提案しました。彼の答え)

列の移動

このソリューションは他のソリューションに自然に従うと思いますsedが、時間がかかり始めました。

おすすめ記事