私はsed、Perl、awk、bashを使ってMacで作業しています。
TAB
13の区切りデータフィールド(列)を含む大容量(10 GB)のテキストファイルがあります。残念ながら、その代謝のいくつかはそれとは何の関係もないのでTABs
試してみました。重複した行全体を削除する TABs
よって、不平等領域が生成される。 (この行を完全に捨てても大丈夫です)
私が現在持っているのは、フィールド数を別のファイルに書き込みます。
awk -F'\t' '{print NF}' infile > fieldCount
head fieldCount
13
13
10
13
13
13
14
13
13
13
13個より多いまたは少ない正しいフィールドを持つすべての行(元のファイルから)を削除する短いスクリプトを作成したいと思います。
- 複数のファイルで行う必要があるため、速度が役立ちます
- 一度にすればいいと思います。
- 現在の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" 完璧
これlist
1つ以上のファイル名および/またはワイルドカードファイル名拡張パターンです。
blue.data green.data *.dat Orange.data red.data /ultra/violet.datのfについて
mv
このコマンドは、入力ファイル(たとえば)を入力ファイルの13フィールド行のみを含む一時ファイルで上書きします。 (これが必要なものであることを確認してください。安全のために最初にデータをバックアップする必要があります。)入力ファイルがすでに存在していても上書きするように指示します。ファイル名が 。blue.data
scharf
-f
mv
--
-
答え2
これは大容量ファイルなので、パフォーマンスを向上させるために、より洗練されたツールを使用することをお勧めします。通常、特別なツールは汎用ツールよりも高速です。たとえば、同じ問題を解決する方が速いcut
ことがよくあります(一方、古いツールができなかった作業を最新のツールが実行できるということです)。grep
sed
awk
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