我试图让所有记录在每个记录的最后一个值开始,但我不知道如何
这是我的输入
grey;5 grey;6 grey;3 blue:2 blue;1 blue;0 red;5 red;7 red;2
这是我预期的输出
grey;3 grey;5 grey;6 grey;3 blue;0 blue:2 blue;1 blue;0 red;2 red;5 red;7 red;2
我使用此命令但不起作用
awk -F\; '{a[$1]=$0} $0; END{for(i in a) print a[i]}' file
我能做什么
请帮帮我
答案 0 :(得分:2)
如果订单无关紧要,您可以这样做:
awk -F\; '{a[$1]=a[$1]"-"$0} END{for(i in a){x=a[i]; match(x, /[^ -]*$/, b); x=b[0]""x; gsub(/-/,"\n", x); print x} }' File
red;2
red;5
red;7
red;2
grey;3
grey;5
grey;6
grey;3
blue;0
blue;2
blue;1
blue;0
注意:在您的示例值中,我认为您的意思是blue;2
而不是blue:2
答案 1 :(得分:1)
我使用GNU awk,因为数据有多个分隔符,但如果您修复了文件中的分隔符,则可以使用任何awk和-F:
,例如:
$ awk -F"[;:]" ' # set the delimiter
$1!=p && NR>1 { # then the $1 changes (excluding the start)
for(j=0;j<=i;j++) # loop thru all stored entries starting and ending with last
print a[j] # and output them
i=0 # reset array index
}
{
p=$1 # previous key for detecting the change
a[0]=a[++i]=$0 # store the last record to array 0 and i
}
END { # in the end flush the buffer
for(j=0;j<=i;j++)
print a[j]
}' file
grey;3
grey;5
grey;6
grey;3
blue;0
blue:2
blue;1
blue;0
red;2
red;5
red;7
red;2