Как объединить следующие записи с помощью команды awk

Проверьте, пуст ли $SSH_CLIENT, а также $DISPLAY. Например:

[[ -z $DISPLAY && -z $SSH_CLIENT && $XDG_VTNR -eq 1 ]] && exec startx

В качестве альтернативы используйте $SSH_CONNECTION или $SSH_TTY

1
25.02.2019, 14:03
4 ответа

Странно. Похоже, что 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
1
27.01.2020, 23:30

Если вас устраивают не-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 '~'.

1
27.01.2020, 23:30

Я сделал по приведенному ниже методу, используя комбинацию 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
0
27.01.2020, 23:30

Когда вы делаете это: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 = "~"}

0
27.01.2020, 23:30

Теги

Похожие вопросы