Проверьте, пуст ли $SSH_CLIENT
, а также $DISPLAY
. Например:
[[ -z $DISPLAY && -z $SSH_CLIENT && $XDG_VTNR -eq 1 ]] && exec startx
В качестве альтернативы используйте $SSH_CONNECTION
или $SSH_TTY
Странно. Похоже, что awk
подавляет ~
при использовании внутри ключей массива. Возможно, потому что ~
— это оператор сопоставления, но я не уверен. В любом случае, это работает так, как вы хотите:
$ awk 'BEGIN{FS=OFS="~";}
{
key=$1"~"$2"~"$3"~"$4"~"$5"~"$6"~"$7"~"$8"~"$9"~"$10;
a[key]+=$11;
b[key]+=$12;
c[key]+=$13
}
END {
for (i in a){
print i,a[i],b[i],c[i]
}
}' file
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~192~0~16
Если вас устраивают не-awk
решения, вы можете попробовать csvsql
из csvkit , который будет идеальным инструментом для этого:
csvsql -H -d '~' --query '
select a,b,c,d,e,f,g,h,i,j,sum(k),sum(l),sum(m)
from file
group by a,b,c,d,e,f,g,h,i,j
' file
Выход:
201901,230615,41302,blank,blank,5,U099164,ARS,blank,30,192,0,16
Если вам нужно, чтобы вывод был разделен ~
-, добавьте | csvformat -D '~'
.
Я сделал по приведенному ниже методу, используя комбинацию awk и sed
awk -F "~" 'BEGIN{sum=0;add=0;wo=0}{sum=sum+$NF}{add=add+$(NF-2)}{wo=wo+$(NF-1)}END{$NF=" ";$(NF-1)=" ";$(NF-2)=" ";print $0,add,wo,sum}' filename | sed -r "s/\s+/ /g"| sed "s/ /~/g"
выход
awk -F "~" 'BEGIN{sum=0;add=0;wo=0}{sum=sum+$NF}{add=add+$(NF-2)}{wo=wo+$(NF-1)}END{$NF=" ";$(NF-1)=" ";$(NF-2)=" ";print $0,add,wo,sum}' p.txt | sed -r "s/\s+/ /g"| sed "s/ /~/g"
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~192~0~16
Когда вы делаете это:a[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10]+=$11
awk использует это как ключ:$1 SUBSEP $2 SUBSEP $3 SUBSEP $4 SUBSEP $5 SUBSEP $6 SUBSEP $7 SUBSEP $8 SUBSEP $9 SUBSEP $10
где отдельные элементы соединены содержимым переменной SUBSEP
. По умолчанию это значение "\034".
См.https://www.gnu.org/software/gawk/manual/html_node/Multidimensional.html
Для этого используйтеBEGIN{FS = OFS = SUBSEP = "~"}