「N」個のフィールドより多い行ま​​たは少ない行を削除しますか?

「N」個のフィールドより多い行ま​​たは少ない行を削除しますか?

私はsed、Perl、awk、bashを使ってMacで作業しています。

TAB13の区切りデータフィールド(列)を含む大容量(10 GB)のテキストファイルがあります。残念ながら、その代謝のいくつかはそれとは何の関係もないのでTABs試してみました。重複した行全体を削除する TABsよって、不平等領域が生成される。 (この行を完全に捨てても大丈夫です)

私が現在持っているのは、フィールド数を別のファイルに書き込みます。

awk -F'\t' '{print NF}' infile  > fieldCount

head fieldCount
13
13
10
13
13
13
14
13
13
13

13個より多いまたは少ない正しいフィールドを持つすべての行(元のファイルから)を削除する短いスクリプトを作成したいと思います。

  1. 複数のファイルで行う必要があるため、速度が役立ちます
  2. 一度にすればいいと思います。
  3. 現在のfieldCountファイルをPythonに移植し、1行ずつロードしようとしています。

編集する:

有効(13列)

a       b       c       d       e       f       g       h       i       j       k       l       m

無効(14列)

a       b       c       d       e       f       g       h       i       j       k       l       m       n

答え1

あなたはほとんどそれを持っています:

awk -F'\t' 'NF==13 {印刷}'ネペレ  >新しいファイル

そして、キー入力(:)で充電されるシステムの1つを使用している場合は、次のように短縮できます。

awk -F'\t' 'NF==13'ネペレ  >新しいファイル

一度に複数のファイルをスキャンして実際にファイルを変更するには(新しいファイルを作成するのではなく)、未使用のファイル名(たとえばscharf)を識別してから、次のループを実行します。

fの場合リスト
する
    awk -F'\t' 'NF==13 {print}' "$f" > scharf && mv -f -- scharf "$f"
完璧

これlist1つ以上のファイル名および/またはワイルドカードファイル名拡張パターンです。

blue.data green.data *.dat Orange.data red.data /ultra/violet.datのfについて

mvこのコマンドは、入力ファイル(たとえば)を入力ファイルの13フィールド行のみを含む一時ファイルで上書きします。 (これが必要なものであることを確認してください。安全のために最初にデータをバックアップする必要があります。)入力ファイルがすでに存在していても上書きするように指示します。ファイル名が 。blue.datascharf-fmv---

答え2

これは大容量ファイルなので、パフォーマンスを向上させるために、より洗練されたツールを使用することをお勧めします。通常、特別なツールは汎用ツールよりも高速です。たとえば、同じ問題を解決する方が速いcutことがよくあります(一方、古いツールができなかった作業を最新のツールが実行できるということです)。grepsedawk

13個以上のタブ文字を含む行を削除するには、次の手順を実行します。

LC_ALL=C grep -Ev '(␉.*){13}'

または(測定可能なパフォーマンスの違いは期待しません)

LC_ALL=C grep -Ev '(␉.*){12}␉'

リテラルタブ文字はどこにありますか?ロケール設定はC必須ではありませんが、一部のGNU grepバージョンはマルチバイトロケールと比較してスピードを上げることができます。

答え3

そしてperl

perl -F'\t' -anle 'print if @F == 13' file

内部で編集するには、-i次のオプションを追加してください。

perl -i.bak -F'\t' -anle 'print if @F == 13' file

関連情報