300GB txtファイルの最初の列を取得する方法は?

300GB txtファイルの最初の列を取得する方法は?

まず、私の問題を詳しく説明します。実は本当に簡単です。私は巨大な.txtファイル(正確には300GB)を持っており、私のパターンに一致する最初の列のすべての異なる文字列を別の.txtファイルに入れたいと思います。

awk '{print $1}' file_name | grep -o '/ns/.*' | awk '!seen[$0]++' > test1.txt

これは私が試したことであり、私が知っている限りうまくいきますが、問題はしばらくすると次のエラーが発生することです。

awk: program limit exceeded: maximum number of fields size=32767
    FILENAME="file_name" FNR=117897124 NR=117897124

これらの大容量ファイルを解析するための提案はありますか?

ベストアンサー1

awk私には、32767以上のフィールドが発生する巨大な線のように聞こえます。しかし、次にこれを再現することはできませんawk

> echo | awk 'BEGIN {for(i=1;i<100000;i++) printf "%d ",i}; { print ""; }' >file
> awk '{ print $50000; }' too_long_line_for_awk.txt
50000

> awk --version
GNU Awk 4.1.0, API: 1.0

長期的に使用できるより強力なツールがあります。最初のフィールドの最大長を決定する必要があります。 100と仮定すると、次のことを試すことができます。

cut -b -100 file | awk ...

また、(しかし、これはあなたの質問とは関係ありません)あなたの設定はawk | grep | awk意味がありません。次のようにできます。

awk '$1 ~ "/ns/" {sub("^.*/ns/","/ns/",$1); if( !seen[$1]++ ) print $1}' \
  file_name >test1.txt

デバッグ提案

Rameshが指摘したように、問題を引き起こす線を見つけるのは興味深いかもしれません。問題行の番号は、次のコマンドで印刷された(またはファイルに書き込まれた)番号の1つでなければなりません。

awk '{ print NR;}' | tail -n 1 >crashline.txt

「衝突」の前にバッファを空にした場合は、awk次の数字(+1)でなければなりません。

おすすめ記事