您好,我正在尝试使用主键获取最后相同类型的记录值
列表.csv
tag1,slate1,flag1,check1,1,2
tag2,slate2,flag2,check2,1,2
tag3,slate3,flag3,check3,1,2
tag1,slate1,flag1,check1,3,4
tag3,slate3,flag3,check3,1,2
这里的主键是 col1+col2+col3+col4
我需要
tag1,slate1,flag1,check1,5,6
在此记录中插入新记录我需要获取最后相同类型的记录[如果存在许多记录,我需要获取最后相同的主键记录] [tag1,slate1,flag1,check1,3,4] 并获取并获取 3,4 值并使其像下面的记录一样,
tag1,slate1,flag1,check1,5,6,3,4
我正在尝试,但没有得到预期的输出。
awk -F, '!dup[$1,$2,$3,$4]++' list.csv - removing duplicates , but able to fetch expected record
awk -F, '!dup["tag1","slate1","flag1","check1"]++' list.csv
我将输入“tag1,slate1,flag1,check1,5,6”值并期望输出如下
tag1,slate1,flag1,check1,5,6,3,4
如果“tag4,slate4,flag4,check4,8,9”记录不存在,则输出将为
tag4,slate4,flag4,check4,8,9,NILL,NILL
答案1
awk -v add='tag1,slate1,flag1,check1,5,6' '
BEGIN{ FS=OFS=","; split(add, arr, ",") }
($1==arr[1] && $2==arr[2] && $3==arr[3] && $4==arr[4]) { append=$5 FS $6 }
END{ print add, (append?append:"NULL,NULL") }' infile
输出:
tag1,slate1,flag1,check1,5,6,3,4
或者用另一种方式做:
awk -v add='tag4,slate4,flag4,check4,8,9' '
BEGIN{ FS=OFS="," }
{ key=$1 FS $2 FS $3 FS $4; if(index(add, key)==1) append=$5 FS $6 }
END{ print add, (append?append:"NULL,NULL") }' infile
输出:
tag4,slate4,flag4,check4,8,9,NULL,NULL
答案2
awk
add='tag1,slate1,flag1,check1,5,6'
awk -F ',' -v add="$add" '
BEGIN {
key = add; sub(/(,[^,]+){2}$/, "", key)
tupl = ",NIL,NIL"
}
{
do{
if (index($0, key FS) == 1)
tupl = FS $(NF-1) FS $NF
} while (getline > 0)
$0 = add tupl
};1
' list.csv
tag1,slate1,flag1,check1,5,6,3,4
GNU sed扩展正则表达式模式打开-E
# helper variables that make it easy to look
# at n process the pattern space in terms of fields
s=, S="[^$s]"
F=$s$S+ F2="($F){2}"
add='tag1,slate1,flag1,check4,5,6'
sed -Ee "
1{H;z;x;s/^/$add/;ba;}
:loop
\$tend
N
:a
/^(.*)$F2\n\1$F2\$/h
s/\n.*//
bloop
:end
G;s/\n\$/,NIL,NIL/;t
g;s/\n.*($F2\$)/\1/
" list.csv
tag1,slate1,flag1,check4,5,6,NIL,NIL