2016-08-10 18 views
0

私は次の形式で表示されるデータのテキストファイルを持っています。awk - 3列形式の出力を出力する

apropos c 
awk nc 
chsh c 
date nc 
grep nc 
i3 nc 
ip6tables nc 

このデータをawkでフィルタリングして、次のような3列形式を生成しようとしています。

apropos   awk   chsh 
date    grep   i3 

ファイルの2番目の列は必要ありませんが、最初の列の整列した出力がきれいです。私は次のコードを見つけ出し、データの最初の列だけを出力するよう少し修正しました。問題は、タブの使用のために整列がずれてしまうことです。

awk '{printf (NR %3 == 0)? $1 "\n" : $1"\t\t" }' 

もう少し研究をやって、私は(すなわち。 "%-10s")はawkのprintf関数を介した幅の使用を発見しました。唯一の問題は、私がそれを自分のコマンドにどのように統合して、それが私が望むことができるのかがかなり分かっていないことです。どんな助けもありがとう、ありがとう!

+0

'ip6tables'を3の倍数ではないので出力に表示しませんか? –

+0

出力する最初の列をすべて探しています。それに関係なく、3の倍数です。 – barefly

+0

あなたの期待する出力を表示してください。 –

答えて

4

これはハードコーディングよりも、あなたにとってより便利かもしれません10のようないくつかの任意のフィールド幅:

$ awk '{ORS=(NR%3?FS:RS); print $1}' file | column -t 
apropos awk chsh 
date  grep i3 
ip6tables 

たり、出力からip6tablesをドロップしたい場合は、あなたのサンプル入力/出力に示すように:

$ awk '{rec = rec OFS $1} !(NR%3){print rec; rec=""}' file | column -t 
apropos awk chsh 
date  grep i3 

あなたはcolumnへのパイプをしませんし、フィールド幅としていくつかの任意の番号を選択したくない場合は、最初に、各列の最大幅を把握するために、入力ファイルの2回のパスを作るためにawkの必要がありますプリント前(https://stackoverflow.com/a/38791539/1745001参照)。

WRT最初の例 - ip6tables後に行方不明に改行があるとき、あなたのcolumnが警告を与えた場合、それを追加しますので、改行で終わっていない入力上の任意のUNIXツールを実行するには、POSIX仕様ごとに未定義の動作に依存している:

$ awk '{ORS=(NR%3?FS:RS); print $1} END{if (NR%3) printf "%s", RS}' file | column -t 
apropos awk chsh 
date  grep i3 
ip6tables 
+1

これは意図したとおりに機能しました。私はあなたのawkステートメントの仕組みの概要を得ることができますか?私はまだ学んでおり、常に理解に興味があります。 – barefly

+0

@barefly awkのmanページでORS、FS、RS、NRを検索し、スクリプトを再読み込みします(値がテスト/設定されていることを確認するために必要な場合は 'print'sを追加してください)。彼らはすぐに私はあなたに特定の質問があれば私に知らせていない場合、私はそれらに答えることをうれしく思います。 –

1

あなたは、次のawk | columnパイプを使用することができます(少なくとも)カラムコマンドのBSD版が警告出力しますので:

column: line too long 

をして、最後の行を省略

awk '{sep=NR%3?OFS:ORS;printf "%s%s", $1, sep}END{if(NR%3)print ""}' a.txt \ 
    | column -t 

注意をリストの行数が列数の倍数でない場合は、その場合の最後の要素の後に改行を出力する必要があります。

1

非AWK溶液

$ cut -d' ' -f1 <file | paste - - - | column -t 

apropos awk chsh 
date  grep i3 
ip6tables 

又はpr

$ cut -d' ' -f1 <file | pr -3at 

apropos     awk      chsh 
date     grep     i3 
ip6tables 
0と