如何使用awk在记录字段的最后一个值开始?

时间:2017-03-22 03:21:57

标签: awk

我试图让所有记录在每个记录的最后一个值开始,但我不知道如何

这是我的输入

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

我能做什么

请帮帮我

2 个答案:

答案 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