特定の文字で区切られたファイルの列形式のテキストがある場合は、特定の列またはすべての列の幅を切り捨てるにはどうすればよいですか?
ユースケースは、スペースで区切られた列を含むいくつかのログファイルを読み取ることです。ログの一部の列は非常に長いURLであるため、ファイルを読み取ることは困難です。私はURLの内容全体にあまり興味がないので、これらの列の長さをもう少し読みやすくしたいと思います。
カットする特定の列を指定する方法を知りたいのですが、実際には長さがNより大きいすべての列を切り捨てる方法だけを調べるだけです。
これまで私はutilsとutilsを見つけましたが、column
どちらもcolrm
これcut
に似ているようですが、私の要件を満たすことはありません。
sed
(理想的には、すでにこれを行ったコンパイルされたユーティリティがあれば最善ですが、などを使ってawk
これを行う方法も探したいと思います。)perl
答え1
sed 's/\([^,]\{0,3\}\)[^,]*/\1/g'
各列は最初の3文字に切り捨てられます。列は「、」文字で区切られます。
仕組み:
(貪欲に)0〜3文字( '、'を除く)で構成される文字列を見つけ、それを最初のグループ(\ 1で参照)として記憶します。
その後、「、」以外のできるだけ多くの文字を見つけようとします。
これらはすべてグループ1(つまり最初の3文字)に置き換えられます。
オプションにより、
g
この操作を行ごとに複数回実行して、最初の列だけでなくすべての列を切り捨てます。
編集する:
コメントで指摘したように([^,]\{3\}\)
。このように、私たちはただ一致します正確に3文字。それより小さい場合は、フィールドを切り捨てる必要がないので問題ありません。したがって、最終コマンドは次のようになります。
`sed 's/\([^,]\{3\}\)[^,]*/\1/g'`
答え2
長いURLのせいで迷惑だと書いたので、ファイルの列構造は重要ではないと想像できます。少なくともファイルを表示するのではなく、ファイルを解析する場合はそうです。
この場合、私の解決策は
perl -pe 's%(http://\S+)%substr($1, 0, 15)%ge' <file_with_long_urls> | column -t
これにより、URLから15文字目以降のすべての文字が削除されますhttp://
。
列が空白以外の文字&
(任意の区切り文字を表す)で区切られている場合、私の解決策は次のようになります。
perl -pe 's%(http://\S+?)(?=&|$)%substr($1, 0, 15)%ge' <file_with_long_urls> | column -s '&' -t
たぶんこれを使うことができます! ?