web-dev-qa-db-ja.com

AWKを使用した列数に基づく行のフィルタリング

1列と2列を含むデータ行があります。私がやりたいのは、2列のみを含む行を抽出することです。

0333 foo
 bar
23243 qux

降伏のみ:

0333 foo
23243 qux

最初にタブがある列が1つしかない行の場合でも、タブで区切られていることに注意してください。

それを行う方法は何ですか?

私はこれを試しましたが失敗しました:

awk '$1!="";{print $1 "\t" $2}' myfile.txt

enter code here
19
neversaint

次のトランスクリプトのように、アクションを制御するには、NF(フィールド数)変数を使用する必要があります。

$ echo '0333 foo
>  bar
> 23243 qux' | awk 'NF==2{print}{}'
0333 foo
23243 qux

これにより、フィールド数が2の場合は行が出力され、それ以外の場合は何も実行されません。私が(一見)奇妙な構成を持っている理由NF==2{print}{}は、行に一致するルールがない場合、awkの一部の実装がデフォルトで出力されるためです。空のコマンド{}これが起こらないことを保証します。

あなたがこれをしないものの1つを持っているのに十分幸運であるならば、あなたは逃げることができます:

awk 'NF==2'

ただし、上記の最初の解決策は両方の場合に機能します。

29
paxdiablo
awk 'NF==2' file
9
ghostdog74
awk '(NF==2){print}' test.txt
5
Vijay