次のような 2 つの列を含む、コロンで区切られた大きなテキスト ファイルがあります。
valueA:valueB
valueC:
valueD:valueE
:valueG
左側にデータがない場合またはコロンの右側にある行全体を削除したい:
valueA:valueB
valueD:valueE
これをどうやって実行すればいいでしょうか?
私が持っている中で最も近いものは次のとおりです:
awk -F : '$2!=""' file > final_output
しかし、これは、行に空の列が含まれているかどうかに関係なく、すべてに一致するようです。
答え1
コマンドは例の行をawk
適切に保持し、行を削除します(したがって、「一致するようです」の意味がよくわかりませんvalueA:valueB
valueD:valueE
valueC:
すべて()。
: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
: 入力の次の行をパターンスペースに追加します