cutコマンドは、テキストファイルから「列」を削除するための標準的なツールです。このコンテキストでは、「列」は、行上の物理的な位置によって識別される文字またはバイトの範囲、または区切り文字で区切られたフィールドの範囲として定義できます。
以前、AWKコマンドの使用について書きました。この詳細なガイドでは、Linuxでのcutコマンドの4つの重要で実用的な例を説明します。これは、非常に役立ちます。
4LinuxでのCutコマンドの実用例
必要に応じて、この記事でリストしたのと同じカットコマンドの実際的な例を説明するこのビデオを見ることができます。
1。文字範囲の操作
-c
で呼び出された場合 コマンドラインオプションの場合、cutコマンドは文字を削除します 範囲。
他のフィルターと同様に、cutコマンドは入力ファイルを変更しませんが、変更されたデータを標準出力にコピーします。コマンド出力をファイルにリダイレクトして結果を保存するか、パイプを使用して別のコマンドへの入力として送信するのはユーザーの責任です。
上のビデオで使用されているサンプルテストファイルをダウンロードした場合は、BALANCE.txt
を見ることができます。 妻が仕事で使用している会計ソフトウェアから直接取得したデータファイル:
sh$ head BALANCE.txt
ACCDOC ACCDOCDATE ACCOUNTNUM ACCOUNTLIB ACCDOCLIB DEBIT CREDIT
4 1012017 623477 TIDE SCHEDULE ALNEENRE-4701-LOC 00000001615,00
4 1012017 445452 VAT BS/ENC ALNEENRE-4701-LOC 00000000323,00
4 1012017 4356 PAYABLES ALNEENRE-4701-LOC 00000001938,00
5 1012017 623372 ACCOMODATION GUIDE ALNEENRE-4771-LOC 00000001333,00
5 1012017 445452 VAT BS/ENC ALNEENRE-4771-LOC 00000000266,60
5 1012017 4356 PAYABLES ALNEENRE-4771-LOC 00000001599,60
6 1012017 4356 PAYABLES FACT FA00006253 - BIT QUIROBEN 00000001837,20
6 1012017 445452 VAT BS/ENC FACT FA00006253 - BIT QUIROBEN 00000000306,20
6 1012017 623795 TOURIST GUIDE BOOK FACT FA00006253 - BIT QUIROBEN 00000001531,00
これは固定幅のテキストファイルです。データフィールドには可変数のスペースが埋め込まれているため、適切に配置されたテーブルとして表示されます。
当然の結果として、データ列は常に各行の同じ文字位置で開始および終了します。ただし、ちょっとした落とし穴があります。その名前にもかかわらず、cut
コマンドでは、実際には、保持するデータの範囲を指定する必要があります 、削除する範囲ではありません 。したがって、のみが必要な場合 ACCOUNTNUM
およびACCOUNTLIB
上記のデータファイルの列には、次のように記述します。
sh$ cut -c 25-59 BALANCE.txt | head
ACCOUNTNUM ACCOUNTLIB
623477 TIDE SCHEDULE
445452 VAT BS/ENC
4356 /accountPAYABLES
623372 ACCOMODATION GUIDE
445452 VAT BS/ENC
4356 PAYABLES
4356 PAYABLES
445452 VAT BS/ENC
623795 TOURIST GUIDE BOOK
範囲とは何ですか?
これまで見てきたように、cutコマンドでは rangeを指定する必要があります。 保持したいデータのそれでは、範囲とは何かをより正式に紹介しましょう。cut
の場合 コマンドでは、範囲はハイフンで区切られた開始位置と終了位置によって定義されます。範囲は1から始まります。つまり、行の最初の項目は項目番号1であり、0ではありません。範囲は包括的です。開始と終了、およびそれらの間のすべての文字が出力に保持されます。終了位置が開始位置より前(「下」)にある範囲を指定するとエラーになります。ショートカットとして、開始またはを省略できます。 以下の表で説明されている終了値:
-
a-b
:aとbの間の範囲(両端を含む) -
a
:範囲a-a
に相当 -
-b
:1-a
と同等 -
b-
:b-∞
と同等
cutコマンドを使用すると、いくつかの範囲をコンマで区切って指定できます。次にいくつかの例を示します。
# Keep characters from 1 to 24 (inclusive)
cut -c -24 BALANCE.txt
# Keep characters from 1 to 24 and 36 to 59 (inclusive)
cut -c -24,36-59 BALANCE.txt
# Keep characters from 1 to 24, 36 to 59 and 93 to the end of the line (inclusive)
cut -c -24,36-59,93- BALANCE.txt
cut
の1つの制限(または表示方法によっては機能) コマンドは、データを並べ替えることはありませんということです。 。したがって、次のコマンドは、範囲が異なる順序で指定されているにもかかわらず、前のコマンドとまったく同じ結果を生成します。
cut -c 93-,-24,36-59 BALANCE.txt
diff
を使用して簡単に確認できます コマンド:
diff -s <(cut -c -24,36-59,93- BALANCE.txt) \
<(cut -c 93-,-24,36-59 BALANCE.txt)
Files /dev/fd/63 and /dev/fd/62 are identical
同様に、cut
コマンドデータを複製しない :
# One might expect that could be a way to repeat
# the first column three times, but no...
cut -c -10,-10,-10 BALANCE.txt | head -5
ACCDOC
4
4
4
5
-o
の提案があったことは言及する価値があります cut
を許可して、これら2つの最後の制限を解除するオプション データを並べ替えたり複製したりするためのユーティリティ。しかし、これはPOSIX委員会によって拒否されました。 「このタイプの拡張機能は、IEEEP1003.2bドラフト標準の範囲外であるためです。」
私の時点では、その提案を拡張機能として実装しているカットバージョンはありません。ただし、そうする場合は、コメントセクションを使用して共有してください。
2。バイト範囲の操作
-b
で呼び出された場合 コマンドラインオプションの場合、cutコマンドはバイトを削除します 範囲。
一見すると、キャラクターの間に明らかな違いはありません。 およびバイト 範囲:
sh$ diff -s <(cut -b -24,36-59,93- BALANCE.txt) \
<(cut -c -24,36-59,93- BALANCE.txt)
Files /dev/fd/63 and /dev/fd/62 are identical
これは、サンプルデータファイルがUS-ASCII文字エンコード(「charset」)をfile -i
として使用しているためです。 コマンドはそれを正しく推測できます:
sh$ file -i BALANCE.txt
BALANCE.txt: text/plain; charset=us-ascii
その文字エンコードでは、文字とバイトの間に1対1のマッピングがあります。 1バイトだけを使用すると、理論的には最大256の異なる文字(数字、文字、句読点、記号など)をエンコードできます。実際には、文字エンコードによっていくつかの特別な値(32または65の制御文字など)が提供されるため、その数ははるかに少なくなります。一般的に見られる)。とにかく、フルバイト範囲を使用できたとしても、それはさまざまな人間の文章を保存するのに十分とは言えません。そのため、今日では、文字とバイト間の1対1のマッピングは標準よりも例外であり、ほとんどの場合、ユビキタスなUTF-8マルチバイトエンコーディングに置き換えられています。ここで、cutコマンドがそれをどのように処理できるかを見てみましょう。
前にも言ったように、その記事の例として使用されているサンプルデータファイルは、妻が使用している会計ソフトウェアからのものです。彼女は最近そのソフトウェアを更新し、その後、エクスポートされたテキストファイルは微妙に異なっていたと付け加えています。自分で違いを見つけてみてください:
sh$ head BALANCE-V2.txt
ACCDOC ACCDOCDATE ACCOUNTNUM ACCOUNTLIB ACCDOCLIB DEBIT CREDIT
4 1012017 623477 TIDE SCHEDULE ALNÉENRE-4701-LOC 00000001615,00
4 1012017 445452 VAT BS/ENC ALNÉENRE-4701-LOC 00000000323,00
4 1012017 4356 PAYABLES ALNÉENRE-4701-LOC 00000001938,00
5 1012017 623372 ACCOMODATION GUIDE ALNÉENRE-4771-LOC 00000001333,00
5 1012017 445452 VAT BS/ENC ALNÉENRE-4771-LOC 00000000266,60
5 1012017 4356 PAYABLES ALNÉENRE-4771-LOC 00000001599,60
6 1012017 4356 PAYABLES FACT FA00006253 - BIT QUIROBEN 00000001837,20
6 1012017 445452 VAT BS/ENC FACT FA00006253 - BIT QUIROBEN 00000000306,20
6 1012017 623795 TOURIST GUIDE BOOK FACT FA00006253 - BIT QUIROBEN 00000001531,00
このセクションのタイトルは、何が変更されたかを見つけるのに役立つ場合があります。しかし、見つかったかどうかにかかわらず、その変更の結果を見てみましょう:
sh$ cut -c 93-,-24,36-59 BALANCE-V2.txt
ACCDOC ACCDOCDATE ACCOUNTLIB DEBIT CREDIT
4 1012017 TIDE SCHEDULE 00000001615,00
4 1012017 VAT BS/ENC 00000000323,00
4 1012017 PAYABLES 00000001938,00
5 1012017 ACCOMODATION GUIDE 00000001333,00
5 1012017 VAT BS/ENC 00000000266,60
5 1012017 PAYABLES 00000001599,60
6 1012017 PAYABLES 00000001837,20
6 1012017 VAT BS/ENC 00000000306,20
6 1012017 TOURIST GUIDE BOOK 00000001531,00
19 1012017 SEMINAR FEES 00000000080,00
19 1012017 PAYABLES 00000000080,00
28 1012017 MAINTENANCE 00000000746,58
28 1012017 VAT BS/ENC 00000000149,32
28 1012017 PAYABLES 00000000895,90
31 1012017 PAYABLES 00000000240,00
31 1012017 VAT BS/DEBIT 00000000040,00
31 1012017 ADVERTISEMENTS 00000000200,00
32 1012017 WATER 00000000202,20
32 1012017 VAT BS/DEBIT 00000000020,22
32 1012017 WATER 00000000170,24
32 1012017 VAT BS/DEBIT 00000000009,37
32 1012017 PAYABLES 00000000402,03
34 1012017 RENTAL COSTS 00000000018,00
34 1012017 PAYABLES 00000000018,00
35 1012017 MISCELLANEOUS CHARGES 00000000015,00
35 1012017 VAT BS/DEBIT 00000000003,00
35 1012017 PAYABLES 00000000018,00
36 1012017 LANDLINE TELEPHONE 00000000069,14
36 1012017 VAT BS/ENC 00000000013,83
コマンド出力in-extensoの上にコピーしました したがって、列の配置に問題があることは明らかです。
説明は、US-ASCII文字(記号、句読点、数字、発音区別符号のないラテン文字)のみを含む元のデータファイルです
ただし、ソフトウェアの更新後に作成されたファイルをよく見ると、新しいエクスポートデータファイルにアクセント付きの文字が保持されていることがわかります。たとえば、「ALNÉENRE」という名前の会社は、以前は「ALNEENRE」(アクセントなし)としてエクスポートされていたのに対し、現在は適切なスペルになっています
file -i
ユーティリティは、ファイルがUTF-8でエンコードされていると報告するため、この変更を見逃しませんでした。
sh$ file -i BALANCE-V2.txt
BALANCE-V2.txt: text/plain; charset=utf-8
UTF-8ファイルでアクセント付き文字がどのようにエンコードされているかを確認するには、hexdump
を使用できます。 ファイル内のバイトを直接確認できるユーティリティ:
# To reduce clutter, let's focus only on the second line of the file
sh$ sed '2!d' BALANCE-V2.txt
4 1012017 623477 TIDE SCHEDULE ALNÉENRE-4701-LOC 00000001615,00
sh$ sed '2!d' BALANCE-V2.txt | hexdump -C
00000000 34 20 20 20 20 20 20 20 20 20 31 30 31 32 30 31 |4 101201|
00000010 37 20 20 20 20 20 20 20 36 32 33 34 37 37 20 20 |7 623477 |
00000020 20 20 20 54 49 44 45 20 53 43 48 45 44 55 4c 45 | TIDE SCHEDULE|
00000030 20 20 20 20 20 20 20 20 20 20 20 41 4c 4e c3 89 | ALN..|
00000040 45 4e 52 45 2d 34 37 30 31 2d 4c 4f 43 20 20 20 |ENRE-4701-LOC |
00000050 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30 30 | 000|
00000060 30 30 30 30 31 36 31 35 2c 30 30 20 20 20 20 20 |00001615,00 |
00000070 20 20 20 20 20 20 20 20 20 20 20 0a | .|
0000007c
hexdump
の00000030行目 一連のスペースの後の出力(バイト20
)、あなたは見ることができます:
- 文字
A
バイト41
としてエンコードされます 、 - 文字
L
バイト4c
でエンコードされます 、 - と文字
N
バイト4e
としてエンコードされます 。
ただし、大文字のLATIN CAPITAL LETTER E WITH ACUTE(Éの正式名称であるため) Unicode標準では) twoを使用してエンコードされます バイトc3 89
そしてここに問題があります:cut
を使用する 範囲がバイト位置で表されるコマンドは、固定長のエンコーディングでは適切に機能しますが、UTF-8やShiftJISのような可変長のエンコーディングでは機能しません。これは、POSIX標準の次の非規範的な抜粋で明確に説明されています。
以前のバージョンのcutユーティリティは、バイトと文字が同等であると見なされる環境で機能していました(一部の実装では、と のモジュロ処理)。マルチバイト文字の拡張された世界では、新しい-bオプションが追加されました。
ちょっと待って! -b
を使用していませんでした 上記の「障害のある」例のオプションですが、-c
オプション。したがって、すべきではありません うまくいった?!?
はい、すべきです :残念ですが、2018年になりましたが、GNU Coreutils 8.30の時点では、cutユーティリティのGNU実装はまだマルチバイト文字を適切に処理していません。 GNUのドキュメントを引用するには、-c
オプションは「今のところ-bと同じですが、国際化によってそれが変わります[…]」 — 10年以上前から存在している言及!
一方、cutユーティリティのOpenBSD実装はPOSIXに準拠しており、マルチバイト文字を適切に処理するために現在のロケール設定を尊重します。
# Ensure subseauent commands will know we are using UTF-8 encoded
# text files
openbsd-6.3$ export LC_CTYPE=en_US.UTF-8
# With the `-c` option, cut works properly with multi-byte characters
openbsd-6.3$ cut -c -24,36-59,93- BALANCE-V2.txt
ACCDOC ACCDOCDATE ACCOUNTLIB DEBIT CREDIT
4 1012017 TIDE SCHEDULE 00000001615,00
4 1012017 VAT BS/ENC 00000000323,00
4 1012017 PAYABLES 00000001938,00
5 1012017 ACCOMODATION GUIDE 00000001333,00
5 1012017 VAT BS/ENC 00000000266,60
5 1012017 PAYABLES 00000001599,60
6 1012017 PAYABLES 00000001837,20
6 1012017 VAT BS/ENC 00000000306,20
6 1012017 TOURIST GUIDE BOOK 00000001531,00
19 1012017 SEMINAR FEES 00000000080,00
19 1012017 PAYABLES 00000000080,00
28 1012017 MAINTENANCE 00000000746,58
28 1012017 VAT BS/ENC 00000000149,32
28 1012017 PAYABLES 00000000895,90
31 1012017 PAYABLES 00000000240,00
31 1012017 VAT BS/DEBIT 00000000040,00
31 1012017 ADVERTISEMENTS 00000000200,00
32 1012017 WATER 00000000202,20
32 1012017 VAT BS/DEBIT 00000000020,22
32 1012017 WATER 00000000170,24
32 1012017 VAT BS/DEBIT 00000000009,37
32 1012017 PAYABLES 00000000402,03
34 1012017 RENTAL COSTS 00000000018,00
34 1012017 PAYABLES 00000000018,00
35 1012017 MISCELLANEOUS CHARGES 00000000015,00
35 1012017 VAT BS/DEBIT 00000000003,00
35 1012017 PAYABLES 00000000018,00
36 1012017 LANDLINE TELEPHONE 00000000069,14
36 1012017 VAT BS/ENC 00000000013,83
予想どおり、-b
を使用する場合 -c
の代わりにバイトモード 文字モードでは、OpenBSDのカット実装はレガシーのcut
のように動作します :
openbsd-6.3$ cut -b -24,36-59,93- BALANCE-V2.txt
ACCDOC ACCDOCDATE ACCOUNTLIB DEBIT CREDIT
4 1012017 TIDE SCHEDULE 00000001615,00
4 1012017 VAT BS/ENC 00000000323,00
4 1012017 PAYABLES 00000001938,00
5 1012017 ACCOMODATION GUIDE 00000001333,00
5 1012017 VAT BS/ENC 00000000266,60
5 1012017 PAYABLES 00000001599,60
6 1012017 PAYABLES 00000001837,20
6 1012017 VAT BS/ENC 00000000306,20
6 1012017 TOURIST GUIDE BOOK 00000001531,00
19 1012017 SEMINAR FEES 00000000080,00
19 1012017 PAYABLES 00000000080,00
28 1012017 MAINTENANCE 00000000746,58
28 1012017 VAT BS/ENC 00000000149,32
28 1012017 PAYABLES 00000000895,90
31 1012017 PAYABLES 00000000240,00
31 1012017 VAT BS/DEBIT 00000000040,00
31 1012017 ADVERTISEMENTS 00000000200,00
32 1012017 WATER 00000000202,20
32 1012017 VAT BS/DEBIT 00000000020,22
32 1012017 WATER 00000000170,24
32 1012017 VAT BS/DEBIT 00000000009,37
32 1012017 PAYABLES 00000000402,03
34 1012017 RENTAL COSTS 00000000018,00
34 1012017 PAYABLES 00000000018,00
35 1012017 MISCELLANEOUS CHARGES 00000000015,00
35 1012017 VAT BS/DEBIT 00000000003,00
35 1012017 PAYABLES 00000000018,00
36 1012017 LANDLINE TELEPHONE 00000000069,14
36 1012017 VAT BS/ENC 00000000013,83
3。フィールドの操作
ある意味で、区切られたテキストファイルのフィールドを操作する方がcut
の方が簡単です。 ユーティリティ。各行で(1バイトの)フィールド区切り文字を見つけるだけでよいので、エンコードの問題を気にせずに、フィールドの内容を出力にそのままコピーしてから出力します。
区切られたテキストファイルのサンプルは次のとおりです。
sh$ head BALANCE.csv
ACCDOC;ACCDOCDATE;ACCOUNTNUM;ACCOUNTLIB;ACCDOCLIB;DEBIT;CREDIT
4;1012017;623477;TIDE SCHEDULE;ALNEENRE-4701-LOC;00000001615,00;
4;1012017;445452;VAT BS/ENC;ALNEENRE-4701-LOC;00000000323,00;
4;1012017;4356;PAYABLES;ALNEENRE-4701-LOC;;00000001938,00
5;1012017;623372;ACCOMODATION GUIDE;ALNEENRE-4771-LOC;00000001333,00;
5;1012017;445452;VAT BS/ENC;ALNEENRE-4771-LOC;00000000266,60;
5;1012017;4356;PAYABLES;ALNEENRE-4771-LOC;;00000001599,60
6;1012017;4356;PAYABLES;FACT FA00006253 - BIT QUIROBEN;;00000001837,20
6;1012017;445452;VAT BS/ENC;FACT FA00006253 - BIT QUIROBEN;00000000306,20;
6;1012017;623795;TOURIST GUIDE BOOK;FACT FA00006253 - BIT QUIROBEN;00000001531,00;
フィールド区切り文字が常にコンマであるとは限らない場合でも、そのファイル形式をCSV(コンマ区切り値の場合)として知っている場合があります。たとえば、セミコロン(;
)はフィールド区切り文字として頻繁に使用されます。フランスで行っているように、すでにカンマを小数点記号として使用している国でデータを「CSV」としてエクスポートする場合は、デフォルトで選択されることがよくあります。したがって、サンプルファイルでその文字を選択します。 )。別の一般的なバリアントは、フィールドセパレータとしてタブ文字を使用し、タブ区切り値ファイルと呼ばれることもあります。最後に、UnixおよびLinuxの世界では、コロン(:
)は、たとえば標準の/etc/passwd
にあるもう1つの比較的一般的なフィールドセパレータです。 および/etc/group
ファイル。
区切りテキストファイル形式を使用する場合は、-f
を使用し続けるフィールドの範囲をcutコマンドに指定します。 オプションであり、-d
を使用して区切り文字を指定する必要があります オプション(-d
なし オプションの場合、カットユーティリティはデフォルトでセパレータのタブ文字になります):
sh$ cut -f 5- -d';' BALANCE.csv | head
ACCDOCLIB;DEBIT;CREDIT
ALNEENRE-4701-LOC;00000001615,00;
ALNEENRE-4701-LOC;00000000323,00;
ALNEENRE-4701-LOC;;00000001938,00
ALNEENRE-4771-LOC;00000001333,00;
ALNEENRE-4771-LOC;00000000266,60;
ALNEENRE-4771-LOC;;00000001599,60
FACT FA00006253 - BIT QUIROBEN;;00000001837,20
FACT FA00006253 - BIT QUIROBEN;00000000306,20;
FACT FA00006253 - BIT QUIROBEN;00000001531,00;
しかし、入力ファイルの一部の行に区切り文字が含まれていない場合はどうなりますか?最初のフィールドのみを含む行としてそれを想像するのは魅力的です。しかし、これはではありません カットユーティリティの機能。
デフォルトでは、-f
を使用する場合 オプションの場合、cutユーティリティは常に区切り文字を含まない行を逐語的に出力します(おそらくこれがヘッダーやある種のコメントのような非データ行であると想定しています):
sh$ (echo "# 2018-03 BALANCE"; cat BALANCE.csv) > BALANCE-WITH-HEADER.csv
sh$ cut -f 6,7 -d';' BALANCE-WITH-HEADER.csv | head -5
# 2018-03 BALANCE
DEBIT;CREDIT
00000001615,00;
00000000323,00;
;00000001938,00
-s
を使用する オプションで、その動作を逆にすることができるので、cut
そのような行は常に無視されます:
sh$ cut -s -f 6,7 -d';' BALANCE-WITH-HEADER.csv | head -5
DEBIT;CREDIT
00000001615,00;
00000000323,00;
;00000001938,00
00000001333,00;
ハックな気分になっている場合は、その機能を比較的あいまいな方法として利用して、特定の文字を含む行のみを保持することができます。
# Keep lines containing a `e`
sh$ printf "%s\n" {mighty,bold,great}-{condor,monkey,bear} | cut -s -f 1- -d'e'
拡張機能として、cutのGNU実装では、--output-delimiter
を使用して出力に異なるフィールド区切り文字を使用できます。 オプション:
sh$ cut -f 5,6- -d';' --output-delimiter="*" BALANCE.csv | head
ACCDOCLIB*DEBIT*CREDIT
ALNEENRE-4701-LOC*00000001615,00*
ALNEENRE-4701-LOC*00000000323,00*
ALNEENRE-4701-LOC**00000001938,00
ALNEENRE-4771-LOC*00000001333,00*
ALNEENRE-4771-LOC*00000000266,60*
ALNEENRE-4771-LOC**00000001599,60
FACT FA00006253 - BIT QUIROBEN**00000001837,20
FACT FA00006253 - BIT QUIROBEN*00000000306,20*
FACT FA00006253 - BIT QUIROBEN*00000001531,00*
その場合、コマンドライン引数で指定された範囲の境界にあるものだけでなく、フィールドセパレータのすべてのオカレンスが置き換えられることに注意してください。
4。非POSIXGNU拡張機能
非POSIXGNU拡張機能と言えば、特に役立つものがいくつかあります。次の拡張機能は、バイト、文字(現在のGNU実装での意味)、またはフィールド範囲で同様に機能します。--complement
そのオプションは、sedアドレスの感嘆符(!
)のように考えてください。 );データを指定された範囲に一致させる代わりに、cut
データが範囲と一致しないようにします
# Keep only field 5
sh$ cut -f 5 -d';' BALANCE.csv |head -3
ACCDOCLIB
ALNEENRE-4701-LOC
ALNEENRE-4701-LOC
# Keep all but field 5
sh$ cut --complement -f 5 -d';' BALANCE.csv |head -3
ACCDOC;ACCDOCDATE;ACCOUNTNUM;ACCOUNTLIB;DEBIT;CREDIT
4;1012017;623477;TIDE SCHEDULE;00000001615,00;
4;1012017;445452;VAT BS/ENC;00000000323,00;
--zero-terminated
(-z
)
改行文字の代わりにNUL文字を行末記号として使用します。 -z
このオプションは、ファイル名を操作する場合など、データに改行文字が埋め込まれている場合に特に便利です(改行はファイル名の有効な文字ですが、NULは有効ではないため)。
-z
オプションが機能するので、少し実験してみましょう。まず、名前に新しい行が埋め込まれたファイルを作成します:
bash$ touch
ここで、各*.txt
の最初の5文字を表示するとします。 ファイル名。素朴な解決策はここで惨めに失敗します:
sh$ ls -1 *.txt | cut -c 1-5
BALAN
BALAN
EMPTY
FILE
WITH
NAME.
すでにls
を読んだことがあるかもしれません は人間が消費するために設計されたものであり、コマンドパイプラインで使用することはアンチパターンです(確かにそうです)。それでは、find
を使用しましょう 代わりにコマンド:
sh$ find . -name '*.txt' -printf "%f\n" | cut -c 1-5
BALAN
EMPTY
FILE
WITH
NAME.
BALAN
そして…これは基本的に以前と同じ誤った結果を生成しました(ただし、ls
のため、順序は異なります) find
のようなファイル名を暗黙的にソートします コマンドは実行しません。
問題はどちらの場合も、cut
コマンドでは、データフィールド(ファイル名)の一部である改行文字と、レコードの終わりマーカーとして使用される改行文字を区別できません。ただし、NULバイト(\0
)ラインターミネータが混乱を解消し、最終的に期待される結果を得ることができるようになります:
# I was told (?) some old versions of tr require using \000 instead of \0
# to denote the NUL character (let me know if you needed that change!)
sh$ find . -name '*.txt' -printf "%f\0" | cut -z -c 1-5| tr '\0' '\n'
BALAN
EMPTY
BALAN
その最新の例では、この記事の核となるcut
から離れています。 指図。それでは、ファンキーな"%f\0"
の意味を自分で理解してみましょう。 -printf
の後 find
の引数 コマンドまたはtr
を使用した理由 パイプラインの最後でコマンドを実行します。
私は、Cutコマンドの最も一般的で最も重要な使用法を示しました。さらに実用的な方法でコマンドを適用できます。それはあなたの論理的推論と想像力に依存します。
以下のコメントセクションを使用して、調査結果を投稿することを躊躇しないでください。そして、いつものように、この記事が気に入ったら、お気に入りのWebサイトやソーシャルメディアで共有することを忘れないでください!