2011-11-11 8 views
4

完全なデータを持たない行をすべて削除できるAwkまたはPerlの1ライナーはありますか?私は自分自身にこのようなものが頻繁に必要であることが分かりましたどのようにフィールド2に値を持たない行を削除することができデータが不完全な行を削除するためのawkまたはPerlソリューション

1 asdf 2 
9 asdx 4 
3 ddaf 6 
5   4 
2 awer 4 

:たとえば、私は現在、次のようになり、タブ区切りのファイルがありますか?

どのようにANYフィールドのいずれかに値を持たない行を削除できますか?

私はこのような何かをしようとしていた。

awk -F"\t" '{if ($2 != ''){print $0}}' 1.txt > 2.txt 

感謝を。 awkでは

+2

シェルコマンドで\を使用する場合は注意してください。この場合、 "\ t"はシェルにエスケープされているので、実際にはTABをフィールドセパレータとして使用したことはありません。 '-F 'を使用すると、あなたのライナーが動作します。 – beny23

答えて

4

、あなたはすべての行が正確に3つの要素持っている必要があることを知っている場合:汎用的なソリューションについて

awk -F'\t' '$2 != ""' input.txt > output.txt 

:具体的な解決のために

awk -F'\t+' 'NF == 3' INFILE > OUTFILE 
+0

ありがとうございます。私はNF変数を知らなかった。それはまさに私が探していたものです。 – drbunsen

+0

ファイルにスペースが含まれている場合、これは機能しません。 – beny23

+0

Hmmm。私はこれを試みたが、awkはタブ文字の間の空白をフィールドとして読み込んでいる。助言がありますか? – drbunsen

0
perl -F/\t/ -nle 'print if @F == 3' 1.txt > 2.txt 
1
perl -lane 'print if $#F == 2' INFILE 
2

を:

awk -F'\t' -vCOLS=3 '{ 
    valid=1; 
    for (i=1; i<=COLS; ++i) { 
     if ($i == "") { 
      valid=0; 
      break; 
     } 
    } 
    if (valid) { 
     print; 
    } 
}' input.txt > output.txt 
2

私は連続したタブを探します、または先頭または末尾のタブ:

perl -ne 'next if /\t\t/ or /^\t/ or /\t$/; print' tabfile 
+0

+1列の数に関する知識を必要としない唯一のソリューションです。 – schot

+0

コメントのうちの1つで、[] +をタブの間に置くことができます。タブに挟まれたスペースは可能です – SAN

0

だけawk 'NF == 3' INFILE > OUTFILEを使用し、それだけでフィールドスプリッタとして空白を(タブ、スペースなど。)を使用します。