合并两行条件 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
我有问题。我想将有条件的两行或三行合并为一行并进行特定打印。
输入:文件有 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