gpt4 book ai didi

linux - 对 awk 关联数组元素的内容进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:56 25 4
gpt4 key购买 nike

最初,该文件的内容如下:

1.2.3.4: 1,3,4
1.2.3.5: 9,8,7,6
1.2.3.4: 4,5,6
1.2.3.6: 1,1,1

在我尝试错误排序后,我得到了这个:

1.2.3.4: 1,3,4,4,5,6,
1.2.3.5: 9,8,7,6,
1.2.3.6: 1,1,1,

我想把它整理成下面的格式:

1.2.3.4: 1,3,4,5,6
1.2.3.5: 6,7,8,9
1.2.3.6: 1

但是我如何访问每个元素中的每个逗号分隔字符并以唯一的升序对它们进行排序以删除重复项?到目前为止我设法使用的唯一 shell 脚本只能访问整个元素:

awk -F' ' 'NF>1{a[$1] = a[$1]$2","}END{for(i in a){print i" "a[i] | "sort -t: -k1 "}}' c.txt

最佳答案

编辑:我第一次将中间数据作为输入,当时原始数据尚未发布,但当然也可以从原始数据中获取。再次使用 GNU awk:

gawk -F '[ ,]' 'BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" } { for(i = 2; i <= NF; ++i) a[$1][$i]; } END { for(ip in a) { line = ip " "; for(n in a[ip]) { line = line n "," } sub(/,$/, "", line); print line } }' filename

代码的工作原理如下:

BEGIN { 
PROCINFO["sorted_in"] = "@ind_num_asc" # GNU-specific: sorted array
# traversal
}
{
for(i = 2; i <= NF; ++i) a[$1][$i] # remember numbers by ip
}
END { # in the end:
for(ip in a) { # for all ips:
line = ip " " # construct the line: IP
for(n in a[ip]) { # numbers in order
line = line n ","
}
sub(/,$/, "", line) # remove trailing comma
print line # print the result.
}
}

中间数据的旧答案:

使用 GNU awk,假设数据的格式与问题中的一样(带有尾随 ,):

gawk -F '[ ,]' 'BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" } { delete a; for(i = 2; i < NF; ++i) a[$i]; line = $1 " "; for(i in a) line = line i ","; sub(/,$/, "", line); print line; }' filename

文件内容按空格和逗号分隔,然后代码工作如下:

BEGIN { 
PROCINFO["sorted_in"] = "@ind_num_asc" # GNU-specific: sorted array
# traversal, numerically ascending
}
{
delete a
for(i = 2; i < NF; ++i) { a[$i] } # remember the fields in a line.
# duplicates are removed here.
# note that it's < NF instead of
# <= NF because the trailing comma
# leaves us with an empty last
# field.

line = $1 " " # start building line: IP field
for(i in a) { # append numbers separated by
line = line i "," # commas
}
sub(/,$/, "", line) # remove last trailing comma
print line # print result.
}

关于linux - 对 awk 关联数组元素的内容进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28811968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com