Объединить две строки с условием AWK

У меня вопрос. Я хотел бы объединить две или три строки с условием в одну строку с определенной печатью.

ВВОД: файл имеет 6 строк и табуляцию с разделителями

LOL   h/h  2  a  b  c
LOLA  h/h  3  b  b  b
SERP  w/w  4  c  c  c 
DARD  s/s  5  d  d  d 
GIT   w/w  6  a  b  c
GIT   h/h  6  a  a  b
GIT   d/d  6  a  b  b
LOL   h/h  7  a  a  a

Вывод: есть 2 условия: если ($1s одинаковы и $3s одинаковы) объединить строки вместе с определенной печатью

LOL   h/h  2  a  b  c
LOLA  h/h  3  b  b  b
SERP  w/w  4  c  c  c 
DARD  s/s  5  d  d  d 
GIT   w/w  6  a  b  c h/h  6  a  a  b d/d  6  a  b  b
LOL   h/h  7  a  a  a

У меня есть этот код:

awk -F'\t' -v OFS="\t" 'NF>1{a[$1] = a[$1]"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6};END{for(i in a){print i""a[i]}}'

Но он объединяется только по 1-му столбцу, и я не уверен, хорошо ли использовать этот код.


person Vonton    schedule 09.11.2016    source источник
comment
Во входе я вижу только один файл...можете добавить второй файл   -  person Jay Rajput    schedule 09.11.2016
comment
также может быть продублирован $1 в одном файле   -  person Jay Rajput    schedule 09.11.2016
comment
Извините, я хотел бы объединить строки с этим условием. Я починил его.   -  person Vonton    schedule 09.11.2016


Ответы (3)


В авке:

$ awk '($1 FS $3) in a{k=$1 FS $3; $1=""; a[k]=a[k] $0;next} {a[$1 FS $3]=$0} END {for(i in a) print a[i]}' file
SERP  w/w  4  c  c  c
LOL   h/h  2  a  b  c
LOLA  h/h  3  b  b  b
DARD  s/s  5  d  d  d
LOL   h/h  7  a  a  a
GIT   w/w  6  a  b  c h/h 6 a a b d/d 6 a b b

Объяснение:

($1 FS $3) in a {  # if keys already seen in array a
    k=$1 FS $3
    $1=""           # remove $1
    a[k]=a[k] $0    # append to existing
    next
} 
{ a[$1 FS $3]=$0 }  # if keys not seen, see them
END { 
    for(i in a)     # for all stored keys 
        print a[i]  # print
}
person James Brown    schedule 09.11.2016
comment
Спасибо, Джеймс и Джей. - person Vonton; 09.11.2016

Вот ответ для gawk v4, который поддерживает многомерный массив. Один столбец из первого файла хранится в многомерном массиве, что легко сравнить со вторым столбцом файла. В моем решении показан пример printf, который вы можете изменить в соответствии с вашими потребностями.

#!/bin/gawk -f

NR==FNR {          # for first file
    a[$1][0] = $2; # Store columns in
    a[$1][1] = $3; # multi dimensional
    a[$1][2] = $4; # array
    a[$1][3] = $5;
    a[$1][4] = $6;
    next;
}

$1 in a && $3 == a[$1][1] {
    printf("%s\t%s\n", $2, a[$1,0])
}
person Jay Rajput    schedule 09.11.2016
comment
Действительно приятно получать результаты по массиву - person Vonton; 09.11.2016

Ответьте, используя gawk v3, где я не могу использовать многомерный массив

#!/bin/gawk -f

NR==FNR {
   a[$1]
   b[$1] = $2;
   c[$1] = $3;
   d[$1] = $4;
   e[$1] = $5;
   f[$1] = $6;
   next;
}

$1 in a && $3 == c[$1] {
    print $0
}

Однострочник

gawk 'NR==FNR {a[$1]; b[$1] = $2; c[$1] = $3; d[$1] = $4; e[$1] = $5; f[$1] = $6; next; } $1 in a && $3 == c[$1] { print $0 }' /tmp/file1 /tmp/file2
person Jay Rajput    schedule 09.11.2016