Awkは、特定の列に基づいてすべての正規化された列を決定して出力します。

Awkは、特定の列に基づいてすべての正規化された列を決定して出力します。

以下は、「\t」で区切られた3つの列と、スペースで区切られた2番目の列を含むファイルです。

            1    a b c d e    Tom
            2    a b          Jason 
            3    c            Lisa
            4    e            Kim 

2番目の列に「NF> 2」という2つ以上の要素を含むファイルをインポートしたいと思います。

            1    a b c d e    Tom
            2    a b          Jason

Ed Mortonのヒントを活用しました。試しましたが、 less -S test.txt | awk -F "\t" '{print $2}' | awk 'NF>2'行全体を取得できませんでした。実際には、列の特定の条件に基づいて条件を満たす行全体を出力する方法を混乱させたことがあります。私はのようないくつかの簡単なケースだけを知っていますcat test.txt | awk '{if( )print$0}'。いくつかの提案をすることができますか?ありがとうございます。

答え1

$ awk -F'\t' 'split($2,a," ") >= 2' input.txt 
1       a b c d e       Tom
2       a b     Jason

TABをフィールド区切り文字として使用すると、$2スペースで区切られた2つ以上の文字列を含む各行が印刷されます。

split()正規表現を区切り文字(この場合は単一のスペース)として使用して、$2文字列()を配列()に分割します。この機能の詳細についてはをa参照してください。man awksplit

この awk one-liner は配列の内容を使用したり気にすることなく、a分割関数の戻り値(文字列が分割された要素数)をチェックします。 2 以上の場合、条件は true と評価され、行全体が印刷されます。


しかし、これがどのように機能するのかをよりよく理解したい場合は、各$ 2の要素数を調べるのが役立ちます。たとえば、戻り値をsplit変数に割り当ててから、n入力行と一緒に印刷します。

$ awk -F'\t' '{n=split($2,a," ");printf "(n=%i)\t%s\n",n,$0}' input.txt 
(n=5)   1       a b c d e       Tom
(n=2)   2       a b     Jason
(n=1)   3       c       Lisa
(n=1)   4       e       Kim

したがって、最初の行には5つの要素があり、2番目の行には2つの要素があり、最後の2行にはそれぞれ1つの要素しかありません。

関連情報