XYより長い場合に行を削除する方法は?


21

たとえば、2048文字より長い場合、行を削除するにはどうすればよいですか?


sedの使用を主張していますか?これは、たとえばpythonで簡単です。そして間違いなくperlの方が簡単です。質問はそれほど明確に定義されていませんが。ファイルをコピーして、2048より長いすべての行を削除しますか?
ファヒムミタ

回答:


22
sed '/^.\{2048\}./d' input.txt > output.txt

3
エラーメッセージが表示されますsed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
wedi 14年

1
@wediは、おそらくMacに同梱されているBSDバージョンの代わりにGNUバージョンをインストールしたいでしょう。これはbrewで簡単です
-Freedom_Ben

質問は「XY(たとえば、2048文字)より長い場合」と言います。そして、それは> 2048とない=> 2048でなければなりません
ajcg

1
@ajcg、> 2048です。正規表現の末尾には、2049番目の文字に一致する余分なピリオドがあります。
forcefsck

@forcefsckそして、それを「^」を取り除いた場合、それは良くないでしょうか?(コマンドを使用すると、「XYZで始まる」行のみが削除されますが、XYZが行の別の部分にある場合は削除されません)
ajcg

7

2049文字以上の行を削除するソリューションは次のとおりです。

sed -E '/.{2049}/d' <file.in >file.out

この式/.{2049}/dは、少なくとも2049文字を含むすべての行に一致し、それらを入力から削除し、出力上に短い行のみを生成します。

awk、長さ2048以下の行を印刷します。

awk 'length <= 2048' <file.in >file.out

sedソリューションを文字通り模倣するawk

awk 'length >= 2049 { next } { print }' <file.in >file.out

1
エラーメッセージが表示されますsed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)(Mac OS X)
wedi 14年

1
@wediがmacOS Mojaveで更新およびテストされました。
クサラナナンダ

2

このようなものはPythonで動作するはずです。

of = open("orig")
nf = open("new",'w')
for line in of:         
    if len(line) < 2048:
        nf.write(line)
of.close()
nf.close()

1
個人的に、@ Faheem、あなたの答えが好きです。理由は、「xより小さいすべての行を削除する」ように簡単に変更できるからです。私はいつもPythonを使っているわけではありませんが、そうするときは常にPythonをよく学ぶ必要があると感じます。
ixtmixilix

@ixtmixilix:はい、Pythonのようなフル機能の言語を使用することは非常に柔軟です。コメントありがとう。
ファヒムミタ

2
perl -lne "length < 2048 && print" infile > outfile

+1 -lただし、必要ありません。
ジョセフR. 14年

私にはうまくいきません。Perl v5.16.2。Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
wedi 14年

試してみてくださいlength($_) > 2048 && print。とにかくのlengthショートカットlength($_)です。
MaratC 14年

0

上記の回答は、Mac OS X 10.9.5では動作しません。

次のコードは機能します。

sed '/.\{2048\}/d'

質問はされていませんが、参照用に提供されていますが、逆の場合は次のコードを実行できます。

sed '/.\{2048\}/!d'


笑、しかしsed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)Mac OS X, 10.10.4
アレックスグレー

あ。上記で提案した@Freedom_Benのように、Macに付属しているBSDバージョンの代わりにGNUバージョンをインストールしました。しかし、Kusalanandaは拡張正規表現を有効にするスイッチを見つけました。したがって、まだ問題がある場合は、彼のソリューションを使用する必要があります。;)
wedi

0

gnu-sedでは、-rフラグを使用して、バックスラッシュとコンマを入力しないようにして、オープン間隔を定義できます。

sed -r  "/.{2049,}/d" input.txt > output.txt

で:

  • x {2049}は正確に2049 xsを意味します
  • x {2049,3072}は2049〜3072 xsを意味します
  • x {2049、}は少なくとも2049 xsを意味します
  • x {、2049}は最大2049 xsを意味します

間隔については、大きなパターンに一致しないようにするには、次のような行アンカーが必要です。

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.