29

次の形式のテキストファイルがあります。

characters(that I want to keep) (space) characters(that I want to remove)

したがって、たとえば:

foo garbagetext
hello moregarbage
keepthis removethis
(etc.)

そのため、Linuxでgrepコマンドを使用して、各行の文字のみを最初の空白スペースまでは含まないようにしようとしていました。私は次のような多くの試みを試みました:

grep '*[[:space:]]' text1.txt > text2.txt
grep '*[^\s]' text1.txt > text2.txt
grep '/^[^[[:space:]]]+/' text1.txt > text2.txt

さまざまな例からつなぎ合わせようとしていますが、運がありませんでした。それらはすべて空白のtext2.txtファイルを生成します。私はこれに不慣れです。私は何が間違っているのですか?

*編集:

残しておきたい部分は大文字です。したがって、各行の空白を含まない(空白以降のすべてを削除する)すべての文字を保持したいと思います。

**編集:

(削除したい)ガベージテキストには、スペースや特殊文字など、何でも含めることができます。たとえば、次のようになります。

AA rough, cindery lava [n -S]

を実行するgrep -o '[^ ]*' text1.txt > text2.txtと、上の行は次のようになります。

AA
rough,
cindery
lava
[n
-S]

text2.txtで。(私が残したいのはAA


解決策(Rohit Jainが提供し、beny23がさらに入力):

 grep -o '^[^ ]*' text1.txt > text2.txt
4

4 に答える 4

43

数量詞*を間違った場所に置いています。

代わりにこれを試してください:-

grep '^[^\s]*' text1.txt > text2.txt

または、さらに良い:-

grep '^\S*' text1.txt > text2.txt  

\S空白以外の文字と一致することを意味します。そして、アンカー^は行の先頭で一致するために使用されます。

于 2013-02-03T20:06:24.267 に答える
17

これはgrepソリューションで長い間答えられてきたと思いますが、将来の世代のために、この特定の状況に対して少なくとも2つのソリューションがあり、どちらもgrepよりも効率的であることに注意してください。

複雑なテキストパターンマッチングを行っていないため、スペースで区切られた最初の列を取得するだけで、awkやcutなどの列ベースのユーティリティの一部を使用できます。

awkを使用する

$ awk '{print $1}' text1.txt > text2.txt

カットを使用

$ cut -f1 -d' ' text1.txt > text2.txt

〜1.1MBファイルのベンチマーク

$ time grep -o '^[^ ]*' text1.txt > text2.txt

real    0m0.064s
user    0m0.062s
sys     0m0.001s
$ time awk '{print $1}' text1.txt > text2.txt

real    0m0.021s
user    0m0.017s
sys     0m0.004s
$ time cut -f1 -d' ' text1.txt > text2.txt

real    0m0.007s
user    0m0.004s
sys     0m0.003s

awkは、の約3倍高速でありgrep、それcutよりも約3倍高速です。繰り返しになりますが、この小さなファイルは1回の実行で大きな違いはありませんが、たとえば再利用のためにスクリプトを作成している場合、または大きなファイルでこれを頻繁に実行している場合は、効率が向上する可能性があります。

于 2013-08-13T18:32:41.307 に答える
0

私はログ行を「色付け」するためにegrepをよく使用しているので、常に正規表現の新しい工夫を探しています。私の場合、上記は次のような\Wを追加することでうまく機能します。

$ egrep --color '^\S*\W|bag' /tmp/barf -o
foo
bag
hello
bag
keepthis
(etc.)

問題は、ほとんどの場合、ログファイルにタイムスタンプが付いているため、サンプルファイルに次の行を追加しました。

2013-06-11 date stamped line

そしてそれはあまりうまく機能しません。それで、以前の正規表現に戻しました。

egrep --color '^\w*\b|bag' /tmp/barf

しかし、日付が刻印されていない行は、それに関する問題を明らかにしまし。色付けなしではこれを見るのは難しいです...

于 2013-06-12T03:47:30.337 に答える
0

@Steveによる回答のフォローアップで、別の区切り文字(コンマなど)を使用する場合は、-Fを使用して指定できます。これは、csvファイルの最初のフィールドの値を読み取ろうとする場合など、各行の内容を最初のコンマまでにする場合に役立ちます。

$ awk -F "," '{print $1}' text1.txt > text2.txt
于 2019-08-31T05:36:34.147 に答える