CSVファイルに列をドロップするコマンドラインスペルはありますか?


32

次の内容のファイルがある:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

私は元のファイルに等しいが、n = 2(または3かもしれません)のようなn番目の列が欠けているファイルを取得しようとします

1111,2222,4444
aaaa,bbbb,dddd

または、n = 0の場合(または1の場合もあります)

2222,3333,4444
bbbb,cccc,dddd

実際のファイルは、数万列のギガバイト長になることがあります。

そのような場合はいつもそうですが、コマンドラインの魔術師はエレガントなソリューションを提供できると思います... :-)

実際の実際のケースでは、最初の列を2回ドロップする必要があります。これは、最初の列をシーケンスで2回ドロップすることで実行できますが、少し一般化する方が面白いと思います。


フィールドに含まれないことが保証されています,か?(つまり、,フィールドセパレータとしてのみ使用されます。)
CVn

@MichaelKjörling、より柔軟なソリューションがあればいいのですが、私の場合-はい:セパレーターは,あり、フィールド内で発生することはありません。
イヴァン

その場合、スコットの答えは単なるものでなければなりません。
CVn

回答:


47

これは、GNU coreutilsからの切り取りに固有のものだと思います。

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

通常は、-fを使用して必要なフィールドを指定しますが、--complementを追加すると、当然、意味が逆になります。「男性カット」から:

--complement
    complement the set of selected bytes, characters or fields

1つの注意点:いずれかの列にカンマが含まれている場合、切り取りはスプレッドシートと同じようにCSVパーサーではないため、切り捨てられます。多くのパーサーは、CSVでコンマをエスケープする方法についてさまざまなアイデアを持っています。単純なCSVの場合、コマンドラインでは、カットを使用する方法がまだあります。


4
単純なCSVファイルであれば、問題なく機能します。列のいずれかがコンマを含む文字列であるcut場合、CSVパーサーではないため、破棄されます。CSVフィールドの値にフィールド区切り記号がある場合、引用符で囲まれます。ところで、をテーマにcut-fフィールドの範囲を取ります。cut -f, -d3-3番目のフィールドを出力し、最初の2つを削除します。
-Alexios

2
あなたは意味cut -d, -f3-
役に立た

@Alexiosそれは良い点です。「本当の」CSVを扱うのは決して簡単ではなく、単純なサブセットのみです。それを反映するように回答を編集します。
スコットマックルン

@役に立たない:くそ、はい。それが私の「カット失読症」と呼ばれるものです。ため息。スコット:CSVファイルは扱いにくい獣です。あまりにも多くの異なるサブフォーマットがあり、その一部はC SVでさえありませんが、とにかくそれは従来から呼ばれています。
-Alexios

これにより、新しいCSVが端末に出力されます。入力を上書きするにはどうすればよいですか(または、新しいファイルに書き込むと、OPが探しているように見えます)。
マックスゲニス14年

12

データが単純にコンマ区切りの列で構成されている場合:

cut -d , -f 1-2,4-

awkを使用することもできますが、フィールドをクリアするのは簡単ですが、セパレータを削除するには多少の手間がかかるため、少し厄介です。空のフィールドがない場合は、それほど悪くはありません。

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

適切に引用されている場合にフィールド内にコンマが表示される可能性がある実際のCSVがある場合、実際のCSVライブラリが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.