代码之家  ›  专栏  ›  技术社区  ›  Steve

有没有一种方法可以合并文本文件中类似(但不相同)的行?[关闭]

  •  -1
  • Steve  · 技术社区  · 6 年前

    我在一个有两列的Linux框中有一个文本文件。 1。IP地址 2。位置代码

    某些IP地址被多次列出,因为有多个代码与之关联。

    例子:

    140.90.218.62 vaac
    140.90.220.11 aawu
    140.90.220.11 afc
    140.90.220.11 arh
    140.90.220.40 afc
    

    我想将这些IP地址合并为只列出一次,只列出几个位置代码

    这样地

    140.90.218.62 vaac
    140.90.220.11 aawu:afc:arh
    140.90.220.40 afc
    

    我总是可以编写一个for循环来读取文件,将值合并到一个数组中,然后将清理后的版本写回。

    在我这样做之前,我想知道,NIX实用程序的组合是否可以完成这项工作,用更少的代码完成这项工作,等等。

    3 回复  |  直到 6 年前
        1
  •  1
  •   steffen    6 年前

    使用AWK

    awk '{a[$1]=($1 in a?a[$1]":"$2:$2)}END{for (i in a) print i, a[i]}' file
    

    输出:

    140.90.220.11 aawu:afc:arh
    140.90.220.40 afc
    140.90.218.62 vaac
    

    说明:

    • a[$1]=($1 in a?a[$1]":"$2:$2) -创建以IP地址为键的索引数组。各 $2 如果已经有一个值,则使用相同的IP连接到由冒号分隔的当前值。
    • for (i in a) print i,a[i] -当stdin关闭时,打印所有条目 a 首先是索引(IP)和所有值。
        2
  •  1
  •   glenn jackman    6 年前

    bash版本4,带有关联数组。

    declare -A data
    while read -r ip value; do
        data[$ip]+=":$value"
    done < file
    
    for key in "${!data[@]}"; do 
        printf "%s %s\n" "$key" "${data[$key]#:}"
    done
    
        3
  •  0
  •   Shawn    6 年前

    与Perl:

    perl -lanE 'push @{$ips{$F[0]}}, $F[1]; END { $" = ":"; say "$_ @{$ips{$_}}" for sort keys %ips }' yourfile.txt
    

    输出

    140.90.218.62 vaac
    140.90.220.11 aawu:afc:arh
    140.90.220.40 afc