いずれかの列が空である行を削除します

いずれかの列が空である行を削除します

次のような 2 つの列を含む、コロンで区切られた大きなテキスト ファイルがあります。

valueA:valueB
valueC:
valueD:valueE
:valueG

左側にデータがない場合またはコロンの右側にある行全体を削除したい:

valueA:valueB
valueD:valueE

これをどうやって実行すればいいでしょうか?

私が持っている中で最も近いものは次のとおりです:

awk -F : '$2!=""' file > final_output

しかし、これは、行に空の列が含まれているかどうかに関係なく、すべてに一致するようです。

答え1

コマンドは例の行をawk適切に保持し、行を削除します(したがって、「一致するようです」の意味がよくわかりませんvalueA:valueBvalueD:valueEvalueC:すべて()。

:valueG最初のフィールドをまったくテストしないため、コマンドは継続されます。

「2 つの列のいずれかが空の行を印刷しない」は、awk次のようにコーディングできます。

awk -F : '! ( $1=="" || $2=="" )'

このタスクは、「各列が空でない行のみを印刷する」ことと同等です。

awk -F : '$1!="" && $2!=""'

Note はawk、この問題に対処するのに非常に適したツールです。この 2 行は、「区切り文字」( -F :)、「列」/「フィールド」( $1$2)、「空であること」( ) などの点で、必要なロジックを反映しています。他のツールを使用したソリューションもあるかもしれませんが、その操作では、必ずしもロジックが明確に表現されるとは限りません。たとえば、…==""の場合:grep

grep '.:.'

上記のコマンドは問題なく動作し、他のコマンドよりもシンプルです。ただし、その形式は問題の要点を直接反映しているわけではありません。そのミニマリズムは美的に気に入っていますが、それでも正しいことだとawk私は思います。awk

答え2

sed と 3 つのsコマンド:

sed 'N; s/\n:/:/; s/\n/:/; s/:$//' file

出力:

値A:値B:値C
値D:値E:値G

からman sed

N: 入力の次の行をパターンスペースに追加します

関連情報