web-dev-qa-db-ja.com

cutコマンドを使用して複数の列を削除する

与えられた入力

 echo 1,2,3,4,5,6,7,8,9、... 100 

列5をカットしたい場合

 cut -d、-f-4,6-

5、7などのように、連続していない複数の列をカットする場合、ライナーは1つですか?

57
user121196

既存の-f仕様でシーケンスを直接続行できるはずです。

5と7の両方をスキップするには、次を試してください。

cut -d, -f-4,6-6,8-

単一の連続した列をスキップするため、これは次のように書くこともできます。

cut -d, -f-4,6,8-

続行するには、5、7、および11をスキップする場合、次を使用します。

cut -d, -f-4,6-6,8-10,12-

より明確な見方をするために、それぞれシーケンスリストの開始/終了にある開始/終了列を使用すると、視覚化が容易になります。たとえば、次の例では列2〜20を印刷し、列5と11をスキップします。

cut -d, -f2-4,6-10,12-20

したがって、これは「2から4」、5をスキップ、「6から10」、11をスキップしてから「12から20」を出力します。

83
newfurniturey

除外するフィールドの観点から考えるのが簡単な場合があります。

カットされていない(出力に保持されていない)フィールドの数が少ない場合、--complementフラグを使用する方が簡単です。 3、7、および12以外のすべてのフィールド1から20を含めるには、次のようにします。

cut -d, --complement -f3,7,12 <inputfile

のではなく

cut -d, -f-2,4-6,8-11,13-
17
Chris Johnson

Seqを使用して、すべての奇数/偶数列をカットできます。

これにより、すべての奇数列が印刷されます

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10)

すべての偶数列を印刷するには、使用できます

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 2 2 10)

Seqの2番目の数を変更することにより、印刷する列を指定できます。

印刷する列の指定がより複雑な場合は、次のような「one-liner-if-clause」も使用できます。

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(for i in $(seq 1 10); do if [[ $i -lt 10 && $i -lt 5 ]];then echo -n $i,; else echo -n $i;fi;done)

これにより、1〜5のすべての列が印刷されます。条件を変更して、より複雑な条件を作成し、列を印刷する天気を指定できます。

12
sge

Perlでも同じことができます
1ベースのインデックス付けではなく0ベースのインデックス付けを使用するため、フィールド値は1だけオフセットされます

Perl -F, -lane 'print join ",", @F[1..3,5..9,11..19]'    

以下と同等です:

cut -d, -f2-4,6-10,12-20

出力にコンマが必要ない場合:

Perl -F, -lane 'print "@F[1..3,5..9,11..19]"'
0
Chris Koknat