カンマ区切りファイルの各行には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用sed
。sed
AT&Tを実装できる場合改善正規表現 - たとえば開かないでパッケージ - 次のようにできます。
sed -nX '/^(([^,]*,){2}c.*)&(.*,)!$/p'
もちろん、後者のシナリオが本当なら、あなたも同様の状況に直面することができます。grep
ksh93
(BTW、内蔵でコンパイル可能)したがって、おそらく次のようにする必要があります。
grep -xX '(([^,]*,){2}c.*)&(.*,)!'
答え3
そしてawk
:
awk -F, '$3 == "c" && $5""' file
awk
、0
および には、""
ブール値コンテキストで2つの偽の値があります。したがって、これを行うと、$3 == "c" && $5
5番目のフィールドを持つ行を見逃す可能性があります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
)に入れて、必須フィールドの状態を確認します。