2016-10-02 6 views
0

文書では、-zオプションは改行文字であるデフォルトの行区切り文字をASCII NULに変更します。どのように正確にそのオプションを使用していますか?この例をご覧ください(ファイルはタブで区切られています):"cut"コマンドにはどのように-zオプションを使用しますか?

$ cat data.tsv 
John Doe 28 New York 
Bob Smith 37 Boston 
Jane Doe 31 Boston 
$ 
$ cut -f1,3 data.tsv 
John Doe New York 
Bob Smith Boston 
Jane Doe Boston 
$ 
$ # This is the output I get: 
$ cut -f1,3 -z data.tsv 
John Doe New York 
Bob Smith$ 

私はその出力を理解できません。正確には何が起こっているのですか?

答えて

3

-zは、入力\n-delimitedの代わりにNULで区切られている場合のものです。 cutが入力をどのように処理するかを変更し、\0の行末で同じ形式のレコードを出力します。

あなたの入力データは以下のようになります。

John Doe 28 New York\nBob Smith 37 Boston\nJane Doe 31 Boston\n 

ではなく改行のNULsを持っていた場合、あなたは-zを使用したい:

John Doe 28 New York\0Bob Smith 37 Boston\0Jane Doe 31 Boston\0 

するとき、これは有用であろうか?それはパイプラインほどファイルのためではありません。たとえば、find -print0を使用して、各名前の後に\0というファイル名を出力することができます。 find -print0は、改行が埋め込まれたファイル名を処理することを可能にします。—これは非常に珍しいですが、改行はファイル名の有効な文字です。 \0は決して正当ではありません。

cut -zが有用である。

他のコマンドの同様のフラグには、xargs -0,read -d ''、およびcpio -0が含まれます。

1

ASCII NULL文字は実際にはファイルの最後ですです。あなたの入力ファイルは、実際には含まれています

John Doe\t28\tNew York\n 
Bob Smith\t37\tBoston\n 
Jane Doe\t31\tBoston\n 
\0 

\n\tタブで、\0はASCII NULLで、新しいラインです)。

行の区切り文字がファイルの終わりである場合、最初のフィールドは "John Doe"(期待どおり)になり、3番目のフィールドは "New York\nBob Smith"になります。 \nはフィールドセパレータではないので、フィールドは次のタブまで実行されます。

関連する問題