あるファイルからドメインの帯域幅を取得し、別のファイルからクリックの詳細を取得しようとします。
両方のファイルの形式は次のとおりです。
帯域幅.txt
aadrivingschool.ws 2840.36M aaspak.org 211.57M aasteknik.com 1419.26M aatonerpk.com 14.87M
ヒット.txt:
onlinestudyboard.com received 186 hits from 31/May/2016 at 1201 aaspak.org received 184 hits from 31/May/2016 at 1202 khawajarubber.com received 183 hits from 31/May/2016 at 1246 aatonerpk.com received 182 hits from 31/May/2016 at 1231
私が得たいものは:
onlinestudyboard.com received 186 hits from 31/May/2016 at 1201
aaspak.org received 184 hits from 31/May/2016 at 1202 211.57M
khawajarubber.com received 183 hits from 31/May/2016 at 1246
aatonerpk.com received 182 hits from 31/May/2016 at 1231 14.87M
答え1
awk
1つの方法は次のとおりです。
$ awk 'FNR==NR{a[$1]=$2; next} {print $0,a[$1]}' bandwidth.txt hits.txt
onlinestudyboard.com received 186 hits from 31/May/2016 at 1201
aaspak.org received 184 hits from 31/May/2016 at 1202 211.57M
khawajarubber.com received 183 hits from 31/May/2016 at 1246
aatonerpk.com received 182 hits from 31/May/2016 at 1231 14.87M
説明する
awk
入力ファイルを1行ずつ読み、行をスペース(または指定された項目-F
)のフィールドに分割します。これらのフィールドは$1
$ 2 ...
$ N`です。
NR==FNR
:NRは現在の行番号、FNRは現在のファイルの行番号です。最初のファイルを読み取る場合のみ、両方とも同じです。a[$1]=$2; next
:これが最初のファイルの場合(上記を参照)、キーが最初のフィールドである配列に2番目のフィールドを保存します。print $0,a[$1]
:現在の行()と最初のフィールドに関連付けられた配列$0
の値を印刷します。a
これにより、2番目のファイルの現在の行と1番目のファイルの最初のフィールドに関連するすべての値が印刷されます。
答え2
そしてタイプ編集する 参加する、柱そして一部強く打つ教義:
join -a 1 <(sort hits.txt) <(sort bandwidth.txt) | column -t | sort -nrk3
3種類が必要です。 2つ目は、入力ファイルが共通フィールドごとにソートされていないためです。参加するソートされた入力が必要です。その他タイプ(3番目のフィールド、逆数)は、OPのソート順序を復元するために必要です。
出力:
onlinestudyboard.com received 186 hits from 31/May/2016 at 1201
aaspak.org received 184 hits from 31/May/2016 at 1202 211.57M
khawajarubber.com received 183 hits from 31/May/2016 at 1246
aatonerpk.com received 182 hits from 31/May/2016 at 1231 14.87M
出力順序が重要ではなく、入力ファイルはい事前分類:
join -a 1 hits.txt bandwidth.txt | column -t