awkを使用したBASHの2行の比較

awkを使用したBASHの2行の比較

このようなテキストファイルがあります。

2015-11-24 12:59:37.112 128.206.6.136 source
2014-11-24 12:59:36.920 8.8.8.8 source
2014-11-24 14:59:38.112 23.234.22.106 destination
2014-11-24 13:59:37.113 23.234.22.106 source
2014-11-24 12:59:29.047 74.125.198.141 source
2014-12-25 12:59:36.920 74.125.198.148 destination

特定のIPアドレスが送信元と宛先として表示されている場合は、そのIPを次に表示したいと思います。両方。この例では、IP 23.234.22.106 は送信元と宛先です。だから私はそれを次のように表示したいと思います。両方

私が望む出力は次のようになります

2015-11-24 12:59:37.112 128.206.6.136 source
2014-11-24 12:59:36.920 8.8.8.8 source
2014-11-24 14:59:38.112 23.234.22.106 both
2014-11-24 12:59:29.047 74.125.198.141 source
2014-12-25 12:59:36.920 74.125.198.148 destination

私が試したことは次のとおりです。

cat input.txt | awk '{print $3}' | sort | uniq | while read line

do 
grep $line input.txt | sort -r -k1 | head -1
done

ただし、特定のIPを次のように表示する方法を理解していません。両方ソースなら目的地でもあります。この場合は23.234.22.106です。

awkを使ってこれを行うにはどうすればよいですか?これにご協力いただきありがとうございます。ありがとう

ベストアンサー1

試してみてくださいsed

sed '
    N    #add next line
    s/\([0-9.]\+\)\s\S\+\n.*\s\1\s\S\+$/\1 both/
    P    #print first line from two
    D    #remove first line, return to start
    ' input.txt
  • [0-9.]\+数字と点のセット
  • \sスペースまたはタブ
  • \S\+空白以外の文字セット
  • \n新しいチーム
  • .*すべてのシンボル
  • \1角かっこで囲まれたグループの逆参照\(...\)
  • $パターンの終わり

(修正:削除tコマンド(tnx 2ゼチル)グローバルアドレスを確認するには、グループの前に\ spaceを追加してください)

おすすめ記事