条件に応じたライン抽出

条件に応じたライン抽出

カンマ区切りファイルの各行には5つのフィールドがあります。

a,b,c,d,e
f,g,c,i,
j,k,c,m,n
o,p,c,r,s
t,u,c,w,
x,y,z,aa,bb

3番目のフィールドにcがあり、5番目のフィールドが空でない行を抽出する方法は?結果は次のとおりです。

a,b,c,d,e
j,k,c,m,n
o,p,c,r,s

答え1

考えられる解決策awk

awk -F',' '$3 == "c" && $5' file

実際のデータによっては、コメントに記載されているとおりに動作しない場合があります(これを指摘したJanisに感謝します。f,g,c,i,0たとえば、5番目のフィールドが0の場合は欠落する可能性があります)。したがって、次のことができます。

awk -F',' '$3 == "c" && $5 != ""' file

これは許容される答えなので、文字列に5番目のフィールドを強制するあまり明確ではない方法を追加します(cuonglm(+ 1)ソリューションに示されているように)。

awk -F',' '$3 == "c" && $5""' file

答え2

sed -n '/,$/!s/^\([^,]*,\)\{2\}c/&/p'

...POSIX用sedsedAT&Tを実装できる場合改善正規表現 - たとえば開かないでパッケージ - 次のようにできます。

sed -nX '/^(([^,]*,){2}c.*)&(.*,)!$/p'

もちろん、後者のシナリオが本当なら、あなたも同様の状況に直面することができます。grep ksh93(BTW、内蔵でコンパイル可能)したがって、おそらく次のようにする必要があります。

grep -xX '(([^,]*,){2}c.*)&(.*,)!'

答え3

そしてawk

awk -F, '$3 == "c" && $5""' file

awk0および には、""ブール値コンテキストで2つの偽の値があります。したがって、これを行うと、$3 == "c" && $55番目のフィールドを持つ行を見逃す可能性があります0。 5番目のフィールドを文字列に$5""変換すると、trueと評価されます。awk"0"

答え4

使用python:

#!/usr/bin/env python2
with open('file.txt') as f:
    for line in f:
        fields = line.rstrip().split(',')
        if fields[2] == 'c' and fields[4]:
            print line.rstrip()

ここでは、カンマ()で区切られた各行のフィールドを,リスト(fields)に入れて、必須フィールドの状態を確認します。

関連情報