sed
CSVファイルに対して次の操作をどのように使用または実行できますか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-1
n
n
n
1
\{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
が、時間がかかり始めました。