タグ付けされた質問 「text-processing」

プログラム、スクリプトなどによるテキストの操作または検査

8
巨大なファイルの改行を含む文字列を置換
メモリー効率のよい方法で文字列を「バイナリ」検索/置換する非行ベースのツールを知っている人はいますか?この質問もご覧ください。 + 2GBのテキストファイルがあり、これと同じように処理したいと思います。 sed -e 's/>\n/>/g' つまり、の後にあるすべての改行を削除したいの>ですが、他の場所ではなく、除外しtr -dます。 このコマンド(同様の質問の答えから得た)は次のように失敗しcouldn't re-allocate memoryます: sed --unbuffered ':a;N;$!ba;s/>\n/>/g' だから、Cに頼らずに他の方法はありますか?私はperlが嫌いですが、この場合は例外を作りたいです:-) データ内に出現しない文字がわからないので、一時的に\n別の文字に置き換えることは可能な限り避けたいものです。 良いアイデアはありますか?

4
異なるファイルの2つの列を比較し、一致する場合に出力する
Solaris 10を使用しているため、-fを含むgrepオプションは機能しません。 パイプで区切られた2つのファイルがあります。 file1: abc|123|BNY|apple| cab|234|cyx|orange| def|kumar|pki|bird| ファイル2: abc|123| kumar|pki| cab|234 file2の最初の2列をfile1と比較したい(最初の2列でfile1の内容全体を検索する)場合、file1の一致する行を印刷します。次に、ファイル2の2行目などを検索します。 期待される出力: abc|123|BNY|apple| cab|234|cyx|orange| 私が持っているファイルは巨大で、約400,000行を含んでいるので、実行を速くしたいと思います。

2
2つのパターン間(および含む)の行を印刷します
行CKの末尾にある行からgrepを開始し、行の末尾にあるときにgrepを停止しDます。試しましたgrep "$CK" "$D" file..txtが、うまくいきませんでした。 入力: kkkkkkkkkkk jjjjjjjjjjjjjjjjjj gggggggggggg/CK JHGHHHHHHHH HJKHKKLKLLL JNBHBHJKJJLKKL JLKKKLLKJLKJ/D GGGGGGGGGGGGGG GGGGGGGGGGGGGG 目的の出力: gggggggggggg/CK JHGHHHHHHHH HJKHKKLKLLL JNBHBHJKJJLKKL JLKKKLLKJLKJ/D


1
大きなマルチGBテキストファイルで重複行を削除する方法は?
私の質問はこの質問に似ていますが、いくつかの異なる制約があります。 私は大きな\n区切りのワードリストを持っています-1行に1ワード。ファイルのサイズは、2GBから最大10GBの範囲です。 重複する行を削除する必要があります。 プロセスは、重複を削除する過程でリストを並べ替えることができますが、必須ではありません。 出力される新しい一意のワードリストを保持するのに十分なスペースがパーティションにあります。 これらの方法の両方を試しましたが、どちらもメモリ不足エラーで失敗します。 sort -u wordlist.lst > wordlist_unique.lst awk '!seen[$0]++' wordlist.lst > wordlist_unique.lst awk: (FILENAME=wordlist.lst FNR=43601815) fatal: assoc_lookup: bucket-ahname_str: can't allocate 10 bytes of memory (Cannot allocate memory) 他にどのようなアプローチを試すことができますか?

5
ファイル内の任意の場所に複数のキーワードを含むファイルを検索します
私は、ファイル内のどこにでも、探しているキーワードの完全なセットを含むディレクトリ内のすべてのファイルをリストする方法を探しています。 そのため、キーワードを同じ行に表示する必要はありません。 これを行う1つの方法は次のとおりです。 grep -l one $(grep -l two $(grep -l three *)) 3つのキーワードは単なる例であり、2つ、または4つなどの場合もあります。 私が考えることができる2番目の方法は次のとおりです。 grep -l one * | xargs grep -l two | xargs grep -l three 別の質問に登場した3番目の方法は次のとおりです。 find . -type f \ -exec grep -q one {} \; -a \ -exec grep -q two {} \; -a …

9
リストを区切り文字付きの単一行に変換します
私は、この形式のIPアドレスのリスト(負荷)を取らなければなりません。 134.27.128.0 111.245.48.0 109.21.244.0 (IPが構成された)で、間のパイプと、この形式に変えます 134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22 私はそれを見つけると思いなどのコマンドを置き換えるsedが、私はそれを動作させることはできません。

4
コマンドの出力をリングバッファに保存する
stdoutで大量の出力を生成する長時間実行コマンドがあります。たとえば、最後の3日間または最後のギビバイト(中央の線を切断しない)のみを保持したいのですが、可能であれば、20 MiB以下のファイルチャンクに保持します。各ファイルチャンクには、数値の接尾辞またはタイムスタンプが付けられています。 何かのようなもの: my-cmd | magic-command --output-file-template=my-cmd-%t \ --keep-bytes=1G \ --keep-time=3d \ --max-chunk-size=20M \ --compress=xz 書くだろう: my-cmd-2014-09-05T10:04:23Z 20Mに達すると、圧縮して新しいファイルを開くなど、しばらくすると、最も古いファイルの削除が開始されます。 そのようなコマンドは存在しますか? 私はlogrotate他のアプリケーションによって書き込まれたファイルを管理する能力を知っていますが、cronジョブのセットアップ、ルールの指定、プロセスの一時停止などを必要としない、よりシンプルなものを探しています。


3
awk +最初のフィールドがLinux1の文字列で始まる場合にのみ行を出力
最初のフィールドがLinux1で始まる場合の行の印刷方法 例えば: echo Linux1_ver2 12542 kernel-update | awk '{if ($1 ~ Linux1 ) print $0;}' 最初のフィールドはLinux1で始まりますが、ターゲットは行を出力することです 行の例: Linux1-new 36352 Version:true Linux1-1625543 9847 Linux1:16254 8467563 備考-最初のファイルの前にスペースまたはTABを挿入できます


5
コマンドSedを使用せずに文字列を見つけて置き換える方法は?
ご存知のように、sed文字列の検索と置換は非常に効率的です。たとえば、「a」を見つけて「b」に置き換えますsed 's/a/b/g'。 代わりに他のコマンドまたはシェルスクリプトでこれを行うことは可能sedですか? これは、sedコマンドを持たない、TV用のトリミングされたLinuxシステム用です。そのため、代わりに他のコマンドまたはスクリプトを使用する必要がありますsed 's/a/b/g'. –


3
頭が余分なキャラクターを食べる
次のシェルコマンドは、入力ストリームの奇数行のみを出力するものと想定されていました。 echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 >/dev/null; done) ただし、代わりに最初の行を出力しますaaa。 -c(--bytes)オプションを使用した場合、同じことは起こりません。 echo 12345678901234567890 | (while true; do head -c 5; head -c 5 >/dev/null; done) このコマンド1234512345は期待どおりに出力します。ただし、これはユーティリティのcoreutils実装でのみ機能しheadます。busyboxのの出力がちょうどあるので、実装はまだ、余分な文字を食べます12345。 この特定の実装方法は、最適化のために行われていると思います。行の終わりがわからないため、読む必要がある文字数がわかりません。入力ストリームから余分な文字を消費しない唯一の方法は、バイト単位でストリームを読み取ることです。ただし、一度に1バイトずつストリームから読み取るのは遅い場合があります。したがってhead、入力ストリームを十分な大きさのバッファに読み込んでから、そのバッファ内の行をカウントすると思います。 --bytesオプションが使用される場合にも同じことは言えません。この場合、読み取る必要があるバイト数がわかります。したがって、このバイト数を正確に読み取ることができますが、それ以上はできません。corelibsの実装は、この機会を使用しますが、busyboxのの 1にはない、それはまだバッファに必要以上のバイトを読み取ります。おそらく実装を簡素化するために行われます。 質問です。headユーティリティが入力ストリームから要求されたより多くの文字を消費することは正しいですか?Unixユーティリティには何らかの標準がありますか?そして、もしあれば、この動作を指定しますか? PS を押しCtrl+Cて上記のコマンドを停止する必要があります。Unixユーティリティは、以降の読み取りで失敗しませんEOF。押したくない場合は、より複雑なコマンドを使用できます。 echo 12345678901234567890 | (while true; do head -c 5; head -c …

5
大量のファイルを結合する
±10,000個のファイル(res.1- res.10000)があり、すべて1つの列と同じ数の行で構成されています。私が欲しいのは、本質的にはシンプルです。すべてのファイルを列ごとに新しいファイルにマージしますfinal.res。私は使用してみました: paste res.* ただし(これは結果ファイルの小さなサブセットで機能するようですが、セット全体で実行すると次のエラーが発生します:Too many open files。 これを実行するための「簡単な」方法が必要ですが、残念ながら私はunixを初めて使用します。前もって感謝します! PS:(私の)データファイルがどのように見えるかを知るため: 0.5 0.5 0.03825 0.5 10211.0457 10227.8469 -5102.5228 0.0742 3.0944 ...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.