使用条件AWK合并两行
我有个问题。我想合并两个或三个条件行到一个特定的打印行 输入:文件有6行和制表符分隔使用条件AWK合并两行,awk,printing,merge,uniq,Awk,Printing,Merge,Uniq,我有个问题。我想合并两个或三个条件行到一个特定的打印行 输入:文件有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 输出:有两个条件:如果($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
GIT h/h 6 a a b
GIT d/d 6 a b b
LOL h/h 7 a a a
输出:有两个条件:如果($1
s相同,$3
s相同)将行与特定打印合并在一起
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列合并,我不确定使用此代码是否合适。在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
}
下面是支持多维数组的GawkV4的答案。第一个文件中的一列存储在多维数组中,很容易与第二个文件列进行比较。我的解决方案显示了一个示例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])
}
使用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
在输入中,我只看到一个文件…您可以添加第二个文件吗?也可以在单个文件中重复$1。对不起,我想合并具有此条件的行。我把它修好了。很高兴收到arrayThanky的结果,你是James和Jay