[英]how to use awk to merge files with common fields and print in another file
[英]How to merge rows in a file based on common fields using awk?
我有一個大的制表符分隔兩個列文件,其中包含許多生化途徑的坐標,如下所示:
A B
B D
D F
F G
G I
A C
C P
P R
A M
M L
L X
如果一行中的第1列等於另一行中的第2列,我想組合這些行,從而產生以下輸出:
A B D F G I
B D F G I
D F G I
F G I
G I
A C P R
C P R
P R
A M L X
M L X
L X
我想使用一些簡單的東西,比如awk 1 liner,有沒有人知道如何在不編寫shell腳本的情況下接近它? 任何幫助表示贊賞。 我試圖了解每個步驟中的每個步驟和每個后續步驟。 由於這些途徑經常交叉,一些步驟由其他途徑共享,但我想分別分析每個途徑。
我嘗試過一個shell腳本,我嘗試在文件后面grep out $ 2 = $ 1的列:
while [ -s test ]; do
grep -m1 "^" test > i
cut -f2 i | sed 's/^/"/' | sed 's/$/"/' | sed "s/^/awk \'\$1 == /" | sed "s/$/' test >> i/" > i.sh
sh i.sh
perl -p -e 's/\n/\t/g' i >> OUT
sed '1d' test > i ; mv i test
done
我知道我的問題來自(a)刪除該行和(b)存在重復的事實。 我只是不確定如何解決這個問題。
輸入
$ cat f
A B
B D
D F
F G
G I
A C
C P
P R
A M
M L
L X
產量
$ awk '{
for(j=1; j<=NF; j+=2)
{
for(i=j;i<=NF;i+=2)
{
printf("%s%s", i==j ? $i OFS : OFS,$(i+1));
if($(i+1)!=$(i+2)){ print ""; break }
}
}
}' RS= OFS="\t" f
A B D F G I
B D F G I
D F G I
F G I
G I
A C P R
C P R
P R
A M L X
M L X
L X
一個班輪
awk '{ for(j=1; j<=NF; j+=2)for(i=j;i<=NF;i+=2){printf("%s%s", i==j ? $i OFS : OFS,$(i+1)); if($(i+1)!=$(i+2)){ print ""; break }}}' RS= OFS="\t" f
好吧,你可以把它放在一行,但我不推薦它:)
#!/usr/bin/awk -f
{
a[NR] = $0
for(i = 1; i < NR; i++){
if(a[i] ~ $1"$")
a[i] = a[i] FS $2
if(a[i] ~ "^"$1){
for(j = i; j < NR; j++){
print a[j]
delete a[j]
}
}
}
}
END{
for(i = 1; i <= NR; i++)
if(a[i] != "")
print a[i]
}
$ <f.txt tac | awk 'BEGIN{OFS="\t"}{if($2==c1){$2=$2"\t"c2};print $1,$2;c1=$1;c2=$2}' | tac
A B D F G I
B D F G I
D F G I
F G I
G I
A C P R
C P R
P R
A M L X
M L X
L X
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.