2016-11-09 68 views
1

我有问题。我想将具有条件的两行或三行合并成一行并进行特定的打印。用条件合并两行AWK

INPUT:文件具有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

Thanky you James and Jay – Vonton

1

这里是答案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]) 
} 
+0

真的很高兴能通过数组获得结果 – Vonton

1

答使用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