使用 awk 比较 BASH 中的两行

Swa*_*are 0 awk text-processing

我有这样的文本文件。

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
Run Code Online (Sandbox Code Playgroud)

如果特定的 Ip 地址被标记为源和目标,那么我想将该 Ip 标记为both。在这种情况下,IP 23.234.22.106 既是源也是目标。所以,我想把它标记为both

我想要的输出应该是这样的

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
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的。

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

do 
grep $line input.txt | sort -r -k1 | head -1
done
Run Code Online (Sandbox Code Playgroud)

但是,我不明白如何标记特定的IP作为两个如果是源和目的地。在这种情况下,23.234.22.106。

我怎样才能使用 awk 做到这一点?对此的任何帮助将不胜感激。谢谢

Cos*_*tas 5

试试 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
Run Code Online (Sandbox Code Playgroud)
  • [0-9.]\+ 一组数字和点
  • \s 空格或制表符
  • \S\+ 一组非空格符号
  • \n 新队
  • .* 任何符号
  • \1 复数中组的反向参考 \(...\)
  • $ 模式结束

(修改:删除t命令(tnx 2 jthill)并在组前添加 \space 以检查完整地址)