与えられた入力
エコー 1,2,3,4,5,6,7,8,9,...100
列を5つ切りたい場合は、できます
カット -d, -f-4,6-
5、7 などの連続していない複数の列をカットしたい場合はどうすればよいですか?
-f
既存の仕様でシーケンスを直接続行できるはずです。
5 と 7 の両方をスキップするには、次を試してください。
cut -d, -f-4,6-6,8-
1 つの連続した列をスキップしているので、これは次のように書くこともできます。
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 番目の数値を変更することで、印刷する列を指定できます。
印刷する列の指定がより複雑な場合は、次のような「ワンライナーif句」を使用することもできます
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 でも同じことができます
。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]"'