合并两行条件 AWK

Merge two rows with condition 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个条件:if (s are the same and s are same) merge rows together with specific printing

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[] = a[]"\t""\t""\t""\t""\t"};END{for(i in a){print i""a[i]}}'

但它仅按第 1 列合并,我不确定使用此代码是否合适。

在 awk 中:

$ awk '( FS ) in a{k= FS ; =""; a[k]=a[k] [=10=];next} {a[ FS ]=[=10=]} 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

解释:

( FS ) in a {  # if keys already seen in array a
    k= FS 
    =""           # remove 
    a[k]=a[k] [=11=]    # append to existing
    next
} 
{ a[ FS ]=[=11=] }  # if keys not seen, see them
END { 
    for(i in a)     # for all stored keys 
        print a[i]  # print
}

这是支持多维数组的 gawk v4 的答案。第一个文件的一列存储在一个多维数组中,很容易与第二个文件的列进行比较。我的解决方案显示了一个示例 printf,您可以根据需要对其进行修改。

#!/bin/gawk -f

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

 in a &&  == a[][1] {
    printf("%s\t%s\n", , a[,0])
}

在我不能使用多维数组的地方使用 gawk v3 回答

#!/bin/gawk -f

NR==FNR {
   a[]
   b[] = ;
   c[] = ;
   d[] = ;
   e[] = ;
   f[] = ;
   next;
}

 in a &&  == c[] {
    print [=10=]
}

单行

gawk 'NR==FNR {a[]; b[] = ; c[] = ; d[] = ; e[] = ; f[] = ; next; }  in a &&  == c[] { print [=11=] }' /tmp/file1 /tmp/file2