
たとえば、列ごとにコンテンツを出力する2つの異なるコマンドがあるとします。
$ command_1
7049857 abc fdg hsi
5409858 xxx fyy hsi
540958 abc zzz hsi
54230956 rbc sss hsi
$ command_2
7049857 0 fdg free
5409858 0 fyy free
540958 2 zzz free
x,y,z
出力からインデックス付きの列を自動的に取得し、index:を使用して新しい出力を印刷したいと思いますcommand_1
。a,b,c
command_2
x,y,z,a,b,c
例:
出力列1そして2から:と:commmand_2
の最後の列command_1
$ new_command
7049857 0 hsi
5409858 0 hsi
540958 2 hsi
私が今まで持っているもの:
私は比較に最初に触れましたが、awk
次のコマンドを使用して各コマンドで対応する列を取得できることを知っていますawk
。
command_1 | awk '{print $x " " $y " " $z}'
command_2 | awk '{print $a " " $b " " $c}'
上記は縦に柱をつなげたものですが、横につなげなければなりません。
最初の列と交差する行のみを印刷します。
想定される行の数はcommand_2
より多くても少なくてもかまいませんcommand_1
。ただし、両方のコマンドの最初の列には次のものが含まれます。同じカテゴリに属するアイテム (上記の例のように複数桁のID)
したがって、2つのコマンドの最初の列が同じように並べ替えられ、新しい項目または欠落している項目が最後にのみ発生する可能性があると仮定すると、合計項目を含む行command_1
(command_2
つまり、両方のコマンド)のみが印刷されるようにどのように保証できますか? (上記の例はこれを示しています)
答え1
次のようにしてみてください。
join <(command1) <(command2) | cut -d ' ' -f 1,5,4
このjoin
コマンドはコマンドではなくファイルを受け入れますが、bashなどのシェルを使用すると、表示された構造を使用してコマンド出力を仮想ファイルに変換できます。
必要にcut
応じてそれも使用できます。awk
これを頻繁に実行する場合は、リレーショナルデータベースエンジンの使用を検討してください。
答え2
awkが必要な場合は、次のいずれかを使用してください。
awk '
NR==FNR {cmd1[$1] = $NF; next}
$1 in cmd1 {print $1, $2, cmd1[$1]}
' <(command_1) <(command_2)
awkFNR
変数は現在のファイルの行番号です。
このNR
変数は、これまで見たすべての行の行番号です。
したがって、条件はNR==FNR
最初のファイルパラメータに対してのみtrueです。