2016-11-09 12 views
1

У меня вопрос. Я хотел бы объединить два или три ряда с условием в одну строку с определенной печатью.Объединить два ряда с условием 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 условия: если ($1 ютса одинаковыми и $3 ютса одинаковыми) объединить строки вместе с конкретной печатью

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-го столбца, и я не уверен, хорошо ли использовать этот код.

+0

В входе, я вижу только один файл ... может вы добавляете второй файл –

+0

также можете копировать 1 доллар в одном файле –

+0

Извините, я хотел бы объединить строки с этим условием. Я его отремонтировал. – Vonton

ответ

1

В AWK:

$ 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 
} 
+0

Спасибо тебе, Джеймс и Джей – Vonton

1

Вот ответ для поглазеть 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]) 
} 
+0

Действительно приятно получать результаты по массиву – Vonton

1

Ответ с помощью поглазеть 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