与えられた入力
echo 1,2,3,4,5,6,7,8,9、... 100
列5をカットしたい場合
cut -d、-f-4,6-
5、7などのように、連続していない複数の列をカットする場合、ライナーは1つですか?
既存の-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」を出力します。
除外するフィールドの観点から考えるのが簡単な場合があります。
カットされていない(出力に保持されていない)フィールドの数が少ない場合、--complement
フラグを使用する方が簡単です。 3、7、および12以外のすべてのフィールド1から20を含めるには、次のようにします。
cut -d, --complement -f3,7,12 <inputfile
のではなく
cut -d, -f-2,4-6,8-11,13-
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のすべての列が印刷されます。条件を変更して、より複雑な条件を作成し、列を印刷する天気を指定できます。
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]"'